‹ All AirLink docs

AirLink

Security and privacy

The keys, the primitives, what a relay or an eavesdropper can see, what is stored on the device and how it is protected, and the limits of the design.

No server

AirLink has no server, no account, no registration and no directory. Identity is a pair of keys generated on the device. Messages and calls move only between devices in radio or local-network range. The apps do not use push notifications. Nothing is sent to the internet by the messaging or calling code.

The More screen on iPhone and iPad contains a link to a website. It opens only if you tap it.

Primitives

All cryptography comes from Apple's CryptoKit.

PurposePrimitive
Identity signingEd25519, long-term
Identity key agreementX25519, long-term
FingerprintFirst 8 bytes of SHA-256 over both public keys
Message sealingHPKE (RFC 9180): DHKEM X25519, HKDF-SHA256, ChaCha20-Poly1305, base mode, info airlink-mesh-hpke-v1
Message authorshipEd25519 signature over the message identifier and text, inside the ciphertext
Call key agreementEphemeral X25519 per call, exchanged inside sealed signalling
Call keysHKDF-SHA256, salt airlink-call-v1, one 32-byte key per direction
Call framesChaCha20-Poly1305, sequence number as nonce and associated data
StorageChaCha20-Poly1305 with a 256-bit key held in the Keychain
Random identifiersSecRandomCopyBytes, 16 bytes per message

What is protected

  • Content. Only the recipient can open a message. Relays carry ciphertext.
  • Authorship. The sender's keys and signature travel inside the ciphertext. A relay learns nothing about who wrote a message from the message itself.
  • Integrity. A tampered message, a message re-labelled with a new identifier, and a tampered voice frame all fail to open and are dropped.
  • Length. Messages are padded to buckets of 256, 512, 1,024, 2,048 or 4,096 bytes, so size reveals only the bucket.
  • Replay of call audio. A 64-frame window drops repeated frames.
  • Numbers. A number is derived from the device's keys, and every message is signed by those keys, so a device cannot speak as a number it does not own.

What an observer can see

Anyone scanning Bluetooth nearby

  • That an AirLink device is present, from the fixed service UUID in its advertisement.
  • The device's Bluetooth address, which the operating system manages and rotates. AirLink cannot add protection at this layer.

Any device that connects to the mesh

Connecting needs no pairing or password. Any device speaking the protocol receives:

VisibleWhere
Your chosen name and both public keysHello packets, which are not encrypted
Your fingerprint and numberDerived from the public keys
Who a message is forThe recipient fingerprint in every packet header
Message, receipt, hello or voiceThe kind byte in the header
When it was sentThe timestamp in the header
Size bucketThe payload length
That a call is in progress, and with whomVoice packets addressed to a fingerprint, 50 a second
The call's frame countThe plaintext sequence number on each voice frame

A relay therefore sees a sealed box addressed to a fingerprint, and can match that fingerprint to a name from the recipient's hellos. It does not see who sent the box.

Anyone on the same local network

  • The Bonjour services AirLink publishes: _airlink._tcp with a random per-launch name, and _airlinkcall._udp named call- and eight characters for each call.
  • The same packets as above, carried over TCP without TLS. Their payloads are already sealed.
  • Call audio on the direct path is sealed per frame.

Limits of the design

  • No forward secrecy for text. Messages are sealed to the recipient's long-term key. Someone who records the mesh and later obtains a recipient's private key can open that recipient's recorded messages. Call audio uses fresh keys for every call.
  • Verification is by people. The only defence against someone substituting their own keys is two people comparing numbers or fingerprints. A 40-bit number read aloud is a convenience, not strong authentication.
  • Traffic analysis. Receipts, call beacons and voice cadence form recognisable patterns. AirLink does not claim resistance to traffic analysis.
  • Denial of service. A nearby radio can flood the mesh with traffic. The bounds are a payload cap of 8,192 bytes, validation before any relay, a bounded duplicate table and a per-link queue that sheds whole packets. There is no per-sender rate limit.
  • Unauthenticated hellos. A hello is not signed. A device can announce any name with any keys. It cannot read messages sealed to someone else's keys, and it cannot sign as them.

What is stored on the device

On the Mac, files live in ~/Library/Application Support/AirLink and ~/Library/Logs/AirLink. On iPhone and iPad, the same names inside the app's own container.

ItemFileProtection
Identity: both private keys and your nameidentity.binSealed with the storage key. File mode 0600
Message and call-event textconversations.json.db (SQLite)Each body sealed with the storage key
Contact cardsSame databaseEach card sealed with the storage key
Message metadata: peer fingerprint, time, direction, delivered, kindSame databaseNot encrypted. File mode 0600
Names you give contacts, and names saved against a numberSame databaseNot encrypted
Your display name and whether to join the mesh at launchApp preferencesNot encrypted
Finder names, favourites and notes for Bluetooth devicesdevices.jsonNot encrypted
Activity log, including names met, numbers and message identifiersLogs/AirLink/activity.logNot encrypted. Appended to, not rotated
Lab spool, only when lab mode is onLogs/AirLink/lab-<session>.jsonlNot encrypted

The storage key is a 256-bit key created on first use and kept in the Keychain, available after first unlock so that a call arriving at a locked phone can still be recorded. If the Keychain refuses to create or return the key, AirLink stores bodies and cards in plaintext rather than fail to save. A tampered sealed row refuses to open.

Remove Device deletes the conversation, the name and the card for that person from the database. The rows are deleted by SQLite; the file is not overwritten.

The finder's matching of rotating Bluetooth addresses is kept in memory for the session only and never written to disk.

On iPhone and iPad, calls are not added to the system's recent calls list.

Lab mode

Lab mode exists for measurement sessions. It is off by default, switched on by hand in Settings, and lapses after three hours. While on, it writes events to a spool file on the device and streams them over the local network to a collector running on a Mac, found through Bonjour.

The events are message identifiers, fingerprints, sizes, hop counts, timings, call milestones, audio counters, link changes, app state and battery level. They do not include message text or audio.