Skip to Content
Usage GuidePrivacy & Security

Privacy & Security

Solidarity’s privacy is designed at the base layer, not bolted on. Here’s how data is protected, when Face ID is required, and how the trust level system works.


All Data Stays On-Device

Data TypeStorageEncryption
DID Master Key + per-RP KeysiOS Keychain (iCloud Keychain sync)Hardware + Apple E2EE
Credentials (VC)SwiftData (App sandbox)iOS Data Protection
ContactsSwiftData (App sandbox)iOS Data Protection
ZK ProofsSwiftData (App sandbox)iOS Data Protection
SettingsUserDefaultsNone (non-sensitive)
Recovery BundleiCloud Drive (non-Keychain)AES-GCM + ECIES

Zero tracking: No remote server records your sharing activity. No analytics. No telemetry. No accounts.


Face ID Rules

Users never need to touch a private key, seed phrase, or any cryptographic detail. “Face ID is your identity.”

Operations that require Face ID

OperationReason
Save passport after scanningSigning the credential
Face-to-face card exchangeSigning the exchange request
Present proofSigning the VP token
Delete credentialDestructive operation
Export all data / social graphHigh-sensitivity
Set up Social RecoveryInvolves key backup
Guardian confirms recovery requestReleases Shamir share

Operations that don’t require Face ID

OperationReason
Browse contactsLow sensitivity
View credential detailsVerified once at app launch
Change settingsNon-destructive

UI Handshake pattern: Show an in-app confirmation screen (describing what’s about to happen) before triggering the system Face ID prompt. Users never get a mysterious biometric request.


Trust Level System

Every credential card must display trust level badge (color + text), trust anchor name, and verification method prominently.

LevelBadgeSourceVerification
L3 — Government🟢Passport NFC chipZKP (mopro) or NFC direct
L2 — Institution🔵Institution-issued VC (v2)VC signature verification
L1 — Self-issuedSelf-filled / Graph CredentialNo third-party verification

Code: solidarity/Models/IdentityEntities.swift


Zero-Knowledge Proofs (ZKP)

Passport ZKP lets you prove to anyone — without revealing passport data — that you:

  • Are 18+ (without disclosing date of birth)
  • Are a real human (without disclosing name, nationality, or passport number)

Technical path: OpenPassport Noir circuit + mopro (on-device, 5-15 seconds). See Zero-Knowledge Proofs architecture for details.


Pairwise DID (Per-Verifier Isolation)

Each verifier (RP) gets an independent key pair — they cannot correlate users across services:

Keychain ├─ "solidarity.master" → did:key (VC issuance, face-to-face exchange) ├─ "solidarity.rp.bar-abc.com" → did:key (proof presentation to Bar ABC) └─ "solidarity.rp.example.com" → did:key (login to example.com)

Each RP sees a different DID. Cross-RP correlation is impossible by design.


Social Recovery (Shamir Secret Sharing)

Concept

Shamir’s Secret Sharing splits the DID Master Key recovery secret into N shares, each encrypted for a guardian. In a disaster, collecting threshold guardian confirmations reconstructs the key.

Prerequisite: at least 5 face-to-face verified contacts.

Setup Flow [SR-1]

  1. App recommends 5 verified contacts as guardians (adjustable, 3–7)
  2. Confirm guardian list + threshold (“5 guardians, 3 needed to recover”)
  3. Face ID confirm

System actions (invisible):

  • Generate Recovery Secret (256-bit random)
  • Shamir SSS: split into N shares, threshold = ⌈N/2⌉+1
  • Encrypt each share with guardian’s DID public key (ECIES)
  • AES-GCM encrypt Master Key backup with Recovery Secret
  • Bundle → iCloud Drive

Guardian design: guardians don’t need to pre-consent; guardians don’t know each other’s identities; Recovery Secret itself is never stored anywhere.

Recovery Flow [SR-2]

Security Analysis

Attack ScenarioDefense
Guardian collusionThreshold design + guardians don’t know each other
Recovery Bundle leakedShares are encrypted with guardian public keys
Guardian device stolenEach share requires Face ID to access
Guardian unreachableThreshold allows partial guardian failure; update list periodically

Code:

  • solidarity/Services/Recovery/
  • solidarity/Views/SettingsViews/ (Social Recovery settings)
Last updated on