WHITEPAPER

Arc Protocol v2.0 — Powered by libsignal

wp.title

wp.subtitle

wp.version · Atlas Associates Inc. · Public

Abstract

wp.abstract

wp.abstractSecurity

wp.s1.title

wp.principle1

wp.principle1Desc

wp.principle2

wp.principle2Desc

wp.principle3

wp.principle3Desc

wp.principle4

wp.principle4Desc

wp.s2.title

wp.th.componentwp.th.algorithmwp.th.standardwp.th.keySize
Key Exchange (Classical)X25519 ECDHRFC 7748256-bit
Key Exchange (Post-Quantum)ML-KEM-1024 (via libsignal)FIPS 203Level 3
Message EncryptionAES-256-GCMNIST SP 800-38D256-bit
Message AuthenticationXEdDSA (libsignal)Signal XEdDSA spec256-bit
Key DerivationHKDF-SHA256RFC 5869256-bit output
Chain Key DerivationHMAC-SHA256RFC 2104256-bit
Protocol BaseSignal ProtocolOpen specification

wp.s2.note

wp.s3.title

wp.s3.desc

Alice → Bob:
1. Fetch Bob's PreKey Bundle (Identity + Signed PreKey + One-Time PreKey + PQ PreKey)
2. 4× X25519 DH computations
3. ML-KEM-1024.Encaps(Bob's PQ Public Key) → (pq_ciphertext, pq_shared_secret)
4. Root Key = HKDF-SHA256(DH1‖DH2‖DH3‖DH4‖pq_shared_secret)
5. Send: Alice's keys + PQ ciphertext (1,088 bytes) + encrypted message

wp.s3.security

wp.th.parameterwp.th.value
Public Key1,184 bytes
Secret Key2,400 bytes
Ciphertext1,088 bytes
Shared Secret32 bytes
NIST Security LevelLevel 3 (AES-192 equivalent)
NIST StandardFIPS 203 (August 2024)

wp.s4.title

wp.s4.desc

DH Ratchet (direction change):
  New Root Key = HKDF-SHA256(current_root_key, X25519_DH_output)

Symmetric Ratchet (per-message):
  Message Key  = HMAC-SHA256(chain_key, 0x01)
  Next Chain   = HMAC-SHA256(chain_key, 0x02)

wp.s4.keys

wp.s5.title

wp.s5.desc

Ciphertext = AES-256-GCM.Encrypt(
  key:   message_key (32 bytes),
  nonce: random (12 bytes, never reused),
  aad:   ratchet_public_key ‖ prev_chain_length ‖ message_number,
  plaintext: message content
)

Per-message overhead: nonce (12B) + auth tag (16B) = 28 bytes

wp.s6.title

wp.differentiator

wp.aegisDesc

wp.th.propertywp.th.description
wp.senderAuthwp.senderAuthDesc
wp.tamperDetectwp.tamperDetectDesc
wp.nonRepudiationwp.nonRepudiationDesc
XEdDSA Signing (via libsignal):
  payload   = senderId ‖ "|" ‖ timestamp ‖ "|" ‖ content
  signature = XEdDSA.Sign(payload, X25519_private_key)
  → 64 bytes attached to message
  (Converts X25519 key to Ed25519 internally — no separate Ed25519 key needed)

Verification:
  XEdDSA.Verify(payload, signature, sender_X25519_public_key)
  → verified | failed | noSignature

wp.s7.title

wp.s7.desc

Sender:
1. Generate ephemeral X25519 keypair
2. DH = X25519(ephemeral_private, recipient_identity_public)
3. AES_Key = HKDF-SHA256(DH, info="Arc Sealed Sender v1")
4. Envelope = AES-256-GCM(senderId + "\0" + payload, AES_Key)

→ Sealed Message = ephemeral_pub(32B) ‖ nonce(12B) ‖ ciphertext ‖ mac(16B)

wp.s7.availability

wp.s8.title

wp.s8.desc

Encryption (libsignal group_encrypt):
  Chain Key → Message Key → AES-256-GCM  (libsignal internal)
  HMAC signature                          (libsignal internal)
  → Output: SenderKeyMessage bytes

Decryption (libsignal group_decrypt):
  Signature verify → Replay detect → Decrypt (libsignal internal)

All crypto operations delegated to libsignal — no custom primitives.

wp.s9.title

wp.th.keywp.th.algorithmwp.th.lifetimewp.th.storage
Identity KeyX25519Account lifetimePlatform Secure Storage
Signing KeyXEdDSA (libsignal)90-day rotationPlatform Secure Storage
Signed PreKeyX25519Weekly rotationPlatform Secure Storage
One-Time PreKeyX25519Single usePlatform Secure Storage
PQ PreKeyML-KEM-1024Single usePlatform Secure Storage (via libsignal)

wp.s9.desc

Elixir PreKey Server

PreKey bundles (Signed PreKey, One-Time PreKeys, PQ PreKeys) are managed by an Elixir-based PreKey server that handles bundle distribution, one-time key depletion tracking, and automatic replenishment signaling to clients.

wp.s10.title

wp.s10.desc

wp.s11.title

wp.s11.desc

wp.s12.title

wp.th.adversarywp.th.capabilitywp.th.mitigation
Passive ObserverIntercepts all trafficE2EE: all content encrypted
Active MITMModifies trafficAES-GCM auth + XEdDSA signatures
Server CompromiseFull Firestore accessNo plaintext stored; keys client-only
Quantum ComputerBreaks X25519Hybrid PQXDH with ML-KEM-1024
Key CompromiseObtains session keyDouble Ratchet forward secrecy
Replay AttackResends messagesIteration tracking + unique nonces

wp.threatCantProtect

  • wp.threatDevice
  • wp.threatScreenshot
  • wp.threatMetadata
  • wp.threatSocial

wp.s13.title

wp.th.standardwp.th.status
NIST FIPS 203 (ML-KEM)Implemented via libsignal-client
RFC 7748 (X25519)Implemented
XEdDSA (Signal spec)Implemented via libsignal-client
RFC 5869 (HKDF)Implemented
NIST SP 800-38D (AES-GCM)Implemented

wp.s14.title

wp.th.featureSignalWhatsAppArc
Protocol BaseSignal ProtocolSignal Protocol (licensed)Signal Protocol (libsignal)
Post-Quantum Key ExchangePQXDH (ML-KEM-1024, 2023)PQXDH (via Signal Protocol)PQXDH (ML-KEM-1024, via libsignal)
Post-Quantum RatchetSPQR Triple Ratchet (Oct 2025)Not confirmedPlanned
Per-Message SignaturesDH authentication onlyDH authentication onlyXEdDSA (libsignal) ✦
Sealed SenderCert + delivery tokenNot implementedEphemeral ECDH envelope ✦
Offline E2EENot supportedNot supportedBLE Mesh (Bridgefy SDK) ✦
Multi-DevicePrimary + LinkedPrimary + LinkedIndependent keys + Key Sync ✦
Key SeparationXEdDSA conversionXEdDSA conversionXEdDSA (same as Signal) — unified key pair ✦
Open SourceFully open sourcePartialWhitepaper published

wp.transparencyNote wp.transparencyDesc

wp.s15.title

wp.s15.intro

XEdDSA (libsignal)

wp.s15.aegis

Client-Side Sealed Sender

wp.s15.sealed

BLE Mesh (Bridgefy SDK Transport Encryption)

wp.s15.mesh

wp.welcome

Download PDF

Enter your details to download the Arc Protocol Whitepaper.

wp.version · Atlas Associates Inc.