IDENTITY & MULTI-DEVICE

Virtual Numbers & Multi-Device Magic

How C6P's +99 virtual number system provides privacy-first identity while supporting seamless multi-device messaging with independent cryptographic keys.

+99
Virtual Prefix
No SIM
Required
Devices
Ed25519
Per Device

The +99 Virtual Number System

Your identity is a permanent virtual number — no SIM card, no phone company, no tracking.

What is a +99 Number?

Every Convro account has a permanent virtual number in the +99 xxx xxx namespace. For example: +99 241 772

No SIM Required

Your identity isn't tied to a phone carrier or physical SIM card

Permanent Identity

Your +99 number is yours for life — never reassigned or rotated

Privacy by Design

No real phone number means no SMS intercepts or carrier tracking

Canonical Identifier

All cryptographic operations bind to your +99 number internally

Example Virtual Number
+99 241 772
↓ Maps internally to
user_id: 550e8400-e29b-41d4-a716-446655440000
username: @alice (optional)
Why +99?

The +99 prefix is a reserved country code that doesn't correspond to any real country. This makes it clear these are virtual identities, not tied to any nation or telecom provider.

One Device = One Identity

Each device installation generates its own cryptographic identity, independent from all others.

Device Identity Components

Every device has its own long-term keypairs that never leave the device:

Component Type Purpose Size
IK_sig Ed25519 Signing & Authentication 32 bytes pub + 64 bytes priv
IK_dh X25519 Key Exchange (DH) 32 bytes pub + 32 bytes priv
device_id SHA-256 Derived from IK_sig 16 bytes (hex32)

Device ID Derivation

Canonical Device ID Generation
device_id = SHA-256(
    "C6P_DEVICE_ID_V1" ||
    IK_sig_pub_bytes(32)
)[0..16]

// Output: 16 bytes
// Wire encoding: hex32 lowercase
// Example: "0123456789abcdef0123456789abcdef"
Deterministic

Same IK_sig always produces same device_id — stable across restores

Secure Storage

Private keys stored in iOS Keychain / Android KeyStore only

Security Property

Server never learns private keys. Identity generation happens entirely on-device. The server only sees public keys during registration.

Multi-Device: Same User, Independent Keys

Use Convro on iPhone, iPad, Mac, and Android — each with its own cryptographic identity linked to your +99 number.

Account → Devices Mapping

👤 User: +99 241 772 (@alice)
├─ 📱 iPhone 15 Pro
│ ├─ device_id: 0123...cdef
│ ├─ IK_sig: Ed25519 (pub: AAAA...ZZZZ)
│ └─ IK_dh: X25519 (pub: BBBB...YYYY)
├─ 💻 MacBook Pro
│ ├─ device_id: 4567...89ab
│ ├─ IK_sig: Ed25519 (pub: CCCC...XXXX)
│ └─ IK_dh: X25519 (pub: DDDD...WWWW)
└─ 📱 iPad Air
├─ device_id: cdef...0123
├─ IK_sig: Ed25519 (pub: EEEE...VVVV)
└─ IK_dh: X25519 (pub: FFFF...UUUU)

Why Separate Identities Per Device?

1
Independent Compromise Scope

If your iPhone is compromised, your MacBook sessions remain secure. Each device has independent cryptographic keys.

2
Platform-Specific Security

iOS Keychain, Android KeyStore, macOS Secure Enclave — each platform's native security works independently.

3
Granular Revocation

Lost your phone? Revoke just that device. Your other devices keep working without re-keying everything.

4
No Key Syncing

Private keys never leave the device they were generated on. No cloud backup, no syncing risk.

History is Per-Device

New devices don't automatically get message history from existing devices. Each device starts fresh with its own cryptographic sessions. This is a privacy-first design choice.

Prekey Bundles: Starting New Sessions

How devices discover each other and establish encrypted sessions through signed prekeys.

What is a Prekey Bundle?

A prekey bundle contains a device's public keys that allow others to initiate encrypted sessions without prior coordination.

Bundle Components

Prekey Bundle Structure
📦 Prekey Bundle
├─ IK_sig_pub (Ed25519, 32 bytes)
├─ IK_dh_pub (X25519, 32 bytes)
├─ SPK (Signed Prekey)
│ ├─ spkId (8 bytes)
│ ├─ spkPub (X25519, 32 bytes)
│ └─ spkSig (Ed25519 signature, 64 bytes)
└─ OTP (One-Time Prekey) (Optional)
├─ otpId (8 bytes)
└─ otpPub (X25519, 32 bytes)

Prekey Lifecycle

SPK

Signed Prekey

  • Rotated every 30 days
  • Medium-term DH component (DH1, DH3)
  • Signed by IK_sig for authenticity
  • Server verifies signature on upload
OTP

One-Time Prekey

  • Single-use only (consumed atomically)
  • Pool of ~100 OTPs per device
  • Enhanced forward secrecy (4DH)
  • Auto-refilled when pool drops below 20
Session Initiation Flow
1. Alice wants to message Bob (+99 654 321)
GET /v1/prekeys/bundle?convroNumber=+99654321
2. Server returns Bob's prekey bundle
{ IK_sig_pub, IK_dh_pub, SPK, OTP }
3. Alice performs 3DH (or 4DH with OTP)
DH1 = X25519(A_IK_dh, B_SPK)
DH2 = X25519(A_EK, B_IK_dh)
DH3 = X25519(A_EK, B_SPK)
DH4 = X25519(A_EK, B_OTP) [if OTP present]
4. Alice derives session keys from IKM
IKM = DH1 || DH2 || DH3 || [DH4]
5. Alice sends encrypted offer to Bob
Asynchronous Messaging

Prekey bundles enable asynchronous messaging. Alice can start a session with Bob even if Bob is offline. When Bob comes online, he decrypts using his local private keys.

Usernames: Human-Friendly Aliases

Optional usernames make Convro easier to use, while cryptography binds to your permanent +99 number.

How Usernames Work

Usernames are aliases that map to your canonical +99 identity. They make it easier to share your contact info without revealing your permanent number.

Username Benefits

  • Easy to remember (@alice)
  • Can be changed anytime
  • Shareable (QR codes, links)
  • Keeps +99 number private

Crypto Binding

  • All crypto binds to +99 number
  • Username changes don't affect keys
  • Sessions persist across renames
  • Server maps @username → user_id
Identity Resolution
User types: "@alice"
↓ Server lookup
Resolves to: +99 241 772
↓ Maps to
user_id: 550e8400-e29b-41d4-a716-446655440000
↓ Fetch devices
Devices: [device_1, device_2, device_3]
Important

Usernames are not part of the cryptographic identity. All session keys, signatures, and bindings use the +99 number and device_id internally. Usernames are purely for UX convenience.

Key Takeaways

+99 virtual numbers provide permanent identity without SIM cards or phone carriers

One device = one identity — each installation has independent Ed25519 + X25519 keypairs

Multi-device support from day one with independent keys per device for security

Prekey bundles enable asynchronous messaging without online coordination

SPK rotation every 30 days + OTP single-use for enhanced forward secrecy

Usernames are aliases — all crypto binds to +99 number, not username string