Private, Peer-to-Peer Messaging with End-to-End Encryption
Version 1.0 — February 2026
Umbra is a cross-platform, end-to-end encrypted messaging platform built on a zero-trust architecture. Unlike conventional messaging applications that rely on centralized servers to process and store messages, Umbra ensures that all message content is encrypted on the user's device before transmission, making it cryptographically impossible for relay servers, network operators, or any third party to access message content.
Messages are encrypted client-side using industry-standard cryptography. Relay servers handle only opaque ciphertext — they never see plaintext content, metadata, or encryption keys.
Traditional messaging platforms operate on a centralized trust model where users must trust the service provider with their communications. Even platforms claiming "end-to-end encryption" often retain significant metadata, require phone number registration, or implement server-side key escrow mechanisms.
| Vulnerability | Impact | Affected Platforms |
|---|---|---|
| Phone number requirements | Identity linkage, SIM swap attacks | Signal, WhatsApp, Telegram |
| Centralized key servers | Single point of compromise | Most E2E platforms |
| Metadata collection | Social graph analysis, timing attacks | Nearly all platforms |
| Closed-source clients | Unverifiable security claims | WhatsApp, iMessage |
| Cloud backup vulnerabilities | Unencrypted message exposure | WhatsApp, iMessage |
Even with strong message encryption, metadata — who communicates with whom, when, and how often — reveals sensitive information. Research has demonstrated that metadata analysis can reveal personal relationships, political affiliations, medical conditions, and more. Traditional messaging platforms collect and retain this metadata indefinitely.
"We kill people based on metadata." — Former NSA Director Michael Hayden, 2014
Umbra addresses these fundamental privacy challenges through a combination of cryptographic innovation and architectural design decisions that minimize trust requirements.
All messages encrypted with X25519 key exchange and AES-256-GCM before leaving the device. Keys never transmitted to servers.
Self-sovereign identity using DID:key method. No registration, no phone numbers, no email addresses required.
Direct WebRTC connections between peers. Relay servers used only for signaling and offline message queuing.
Relay servers handle encrypted blobs only. No access to message content, sender/recipient relationships, or encryption keys.
Encrypted messages queued for offline recipients with 7-day TTL. Delivered automatically when recipient reconnects.
Native applications for iOS, Android, macOS, Windows, Linux, and web browsers. Single codebase via React Native + Rust.
Umbra's architecture is designed to minimize the trust users must place in any single entity:
Figure 1: Umbra System Architecture — Four-layer design from client applications to relay infrastructure
| Layer | Technology | Purpose |
|---|---|---|
| Frontend | React Native + Expo | Cross-platform UI (iOS, Android, Web) |
| Desktop | Tauri (Rust) | Native desktop shell (macOS, Windows, Linux) |
| Core | Rust + WebAssembly | Cryptography, networking, storage |
| Networking | libp2p + WebRTC | P2P connections, NAT traversal |
| Database | SQLite / sql.js | Encrypted local storage |
| Relay | Rust + Axum | WebSocket signaling server |
Relay servers provide three core functions while maintaining zero knowledge of message content:
Multiple relay servers can form a federation mesh, enabling geographic distribution and redundancy. Users on different relays can communicate seamlessly — the federation protocol routes messages automatically.
Umbra employs a carefully selected set of cryptographic primitives, all implemented using audited, pure-Rust libraries from the dalek-cryptography and RustCrypto projects:
| Algorithm | Standard | Purpose | Security Level |
|---|---|---|---|
| Ed25519 | RFC 8032 | Digital signatures | 128-bit |
| X25519 | RFC 7748 | Key exchange (ECDH) | 128-bit |
| AES-256-GCM | NIST SP 800-38D | Authenticated encryption | 256-bit |
| HKDF-SHA256 | RFC 5869 | Key derivation | 256-bit |
| PBKDF2-SHA512 | RFC 8018 | Seed derivation | 256-bit |
| SHA-512 | FIPS 180-4 | Hashing | 256-bit |
Figure 2: Key Hierarchy — From recovery phrase to derived purpose-specific keys
Each message is encrypted using the following protocol:
"umbra-message-encryption-v1".sender_did || recipient_did || timestampUmbra uses the DID:key method for self-certifying identifiers:
did:key:z6MkhaXgBZDvotDUGRy7K9L7M2yvCpREH5eXtbA8vwFRNbfH
The DID encodes the user's Ed25519 public key directly, enabling:
End-to-end encrypted conversations between two users. Messages encrypted with unique per-conversation keys derived via HKDF.
Encrypted group conversations with shared group keys. Key rotation on member changes ensures forward secrecy.
Encrypted messages queued on relay servers for offline recipients. 7-day retention with automatic delivery on reconnection.
Optional encrypted delivery and read confirmations. Recipients control whether to send receipts.
Umbra supports encrypted 1:1 voice and video calls using WebRTC:
Large-scale community support with Discord-like features:
24-word BIP-39 recovery phrase. No phone numbers or email addresses. Full identity portability across devices.
Single-scan friend requests via relay-assisted sessions. Works even when one party is offline.
Friend requests, blocking, and contact nicknames. All contact data encrypted locally.
Restore identity on any device using recovery phrase. Message history synced via encrypted relay.
Umbra's P2P architecture enables unrestricted file sharing that competitors cannot match:
| Capability | Umbra | Competitors |
|---|---|---|
| File Size Limit (Desktop) | Unlimited | 100MB–2GB |
| File Size Limit (Web) | 2GB | 25MB–100MB |
| Transfer Method | Direct P2P | Server upload/download |
| Storage Location | Your device | Their servers |
| Encryption | Per-file E2E | Varies |
Figure 3: P2P File Transfer — Direct WebRTC with relay fallback for NAT-blocked peers
Umbra's plugin system enables community-driven growth while maintaining security through sandboxed execution:
Figure 4: Plugin Architecture — Sandboxed execution with controlled API access
| Traditional Platforms | Umbra |
|---|---|
| Features controlled by corporation | Features built by community |
| Updates when company decides | Plugins update independently |
| Limited customization | Unlimited customization |
| Vendor abandonment kills features | Community maintains plugins |
Traditional platforms grow based on corporate roadmaps and investor demands. Umbra grows based on what users actually want:
Figure 5: Platform Growth Models — Corporate-driven vs Community-driven
| Community Need | Plugin Solution | On Traditional Platforms |
|---|---|---|
| Gaming group wants voice channel push-to-talk | Community builds PTT plugin in days | Wait years for roadmap, if ever |
| Journalists need secure file drop | Build SecureDrop integration plugin | Not profitable, never built |
| Developers want GitHub notifications | GitHub webhook plugin available | Pay for enterprise tier |
| Community wants custom emoji reactions | Emoji pack plugins, unlimited | Limited to paid tiers |
| Activists need message auto-delete | Ephemeral message plugin | Conflicts with data harvesting |
When a service is free, you are the product. Here's how major platforms and their partners profit from your private communications:
Figure 6: How your messaging data flows to third parties who profit from it
| Company | What They Did | Scale | Source |
|---|---|---|---|
| Cambridge Analytica + Facebook | Harvested user data to build psychological profiles, used for political manipulation in 2016 US election and Brexit | 87 million users | NY Times, FTC $5B Fine |
| Palantir + Various | Aggregates data from social platforms to build surveillance profiles for governments and corporations | Billions of records | Vice, The Intercept |
| Meta/WhatsApp | Shares metadata (who you talk to, when, how often) with Facebook for ad targeting despite "E2E encryption" | 2+ billion users | ProPublica, EFF Analysis |
| Discord | Scans all messages, sells behavioral data to advertisers, shares with law enforcement without warrant | 150+ million users | Discord Privacy Policy, Transparency Report |
| Slack | Enterprise customers can read all employee DMs. AI trained on customer conversations without consent. | 20+ million users | Slack Discovery, Wired |
| Telegram | Non-E2E by default. Stores all messages on servers. Has complied with authoritarian government requests. | 700+ million users | EFF, Reuters |
| Clearview AI | Scraped billions of photos from social/messaging platforms to build facial recognition database sold to police | 30+ billion images | NY Times, ACLU Settlement |
Other platforms promise not to exploit your data. Umbra makes it technically impossible:
| Attack Vector | Other Platforms | Umbra |
|---|---|---|
| Read message content | Stored in plaintext or with keys they control | E2E encrypted — servers see only ciphertext |
| Build social graph | Know all your contacts and who you message | P2P connections — relays don't know who talks to whom |
| Track message timing | Full timestamp logs of all activity | Direct P2P — no centralized timing data |
| Link real identity | Phone/email required, linked to real identity | No registration — cryptographic identity only |
| Sell to data brokers | Business model depends on it | No data to sell — we don't have it |
| Comply with mass surveillance | Can provide everything to government | Cannot comply — data doesn't exist on servers |
| Train AI on conversations | Your chats train their models | Conversations never leave your device |
Centralized platforms are honeypots for attackers. Here are real breaches that are architecturally impossible on Umbra:
| Incident | Platform | Impact | Source | Why Impossible on Umbra |
|---|---|---|---|---|
| WhatsApp Pegasus Exploit (2019) | Zero-click spyware via call. Journalists, activists targeted. | Guardian, Citizen Lab | No phone numbers = no phone-based attacks | |
| Discord Data Breach (2023) | Discord | User data exposed via compromised support agent. | Discord Blog, BleepingComputer | No support agents have access — E2E encrypted |
| Slack Security Incident (2022) | Slack | Private code repositories and tokens exposed. | Slack Blog, SecurityWeek | No API tokens to steal — P2P architecture |
| Telegram Phone Leak (2020) | Telegram | 42 million Iranian user phone numbers exposed. | Comparitech, ZDNet | No phone numbers ever collected |
| Facebook Audio Transcription (2019) | Messenger | Contractors transcribed private voice messages. | Bloomberg, The Verge | Voice P2P with DTLS-SRTP — no server recording |
| Signal Twilio Breach (2022) | Signal | 1,900 phone numbers exposed via Twilio phishing. | Signal Blog, TechCrunch | No phone-based registration — no third-party SMS |
| Microsoft Teams Token Flaw (2023) | Teams | Auth tokens stored in plaintext, full account access. | Vectra Research, Dark Reading | No central auth server — cryptographic identity |
| Zoom Bombing (2020) | Zoom | Predictable meeting IDs, mass harassment. | FBI Warning, NY Times | Cryptographic handshakes required — no guessable IDs |
Eliminated. No message content, contacts, or metadata stored on servers. Hackers breach relay → get encrypted blobs, useless without keys.
Eliminated. No employees can access user data because no user data exists on our infrastructure. Zero trust architecture.
Eliminated. No phone numbers involved. Identity is a cryptographic key pair, not a phone number that can be hijacked.
Eliminated. No passwords or usernames. Your 24-word recovery phrase is your identity — never transmitted, never stored remotely.
Eliminated. Even with a warrant, we cannot provide message content. Cryptographic design, not policy promises.
Minimized. Open source code is auditable. No third-party SMS, email, or identity providers in the authentication chain.
Other platforms say "trust us with your data." Umbra says "we cannot access your data even if we wanted to." This isn't policy — it's mathematics. The encryption keys exist only on your device.
Unlike traditional platforms where more users means more server costs and infrastructure burden, Umbra's P2P architecture means every new user strengthens the entire network.
Figure 7: Scaling comparison — Centralized bottleneck vs P2P mesh strengthening
| Network Size | Direct P2P Success Rate | Relay Usage | Boost Node Dependency |
|---|---|---|---|
| Early Stage (1K users) | ~40% | High — most messages via relay | High — files cached on boost nodes |
| Growing (100K users) | ~65% | Medium — relay for offline/NAT | Medium — popular files P2P cached |
| Mature (1M+ users) | ~85% | Low — relay mainly for signaling | Low — DHT provides file discovery |
| Scale (10M+ users) | ~95% | Minimal — direct connections dominate | Minimal — peers serve each other |
More users → More peers online → Higher chance of direct connection → Faster transfers → Better experience → More users join → Network gets even stronger
With more peers, files are cached across more devices. Popular files can be downloaded from nearby peers instead of distant relays. Swarm downloads from multiple peers simultaneously.
More users online = higher chance your recipient is reachable directly. P2P connections have lower latency than relay-routed messages. Real-time feels truly real-time.
Messages can be held by mutual friends until recipient comes online. Multiple paths to reach any user. Network routes around failures automatically.
Less relay bandwidth needed as P2P takes over. Community boost nodes share the load. The network becomes self-sustaining rather than dependent on central infrastructure.
Boost nodes are community-operated servers that enhance network performance without compromising privacy. They're the bridge between full P2P and traditional infrastructure.
Figure 8: Boost nodes cache encrypted content for faster delivery to offline recipients
| Function | How It Works | Privacy Guarantee |
|---|---|---|
| File Caching | Stores encrypted file chunks for community members. Serves files when original uploader is offline. | Only encrypted chunks stored. No keys, no filenames, no metadata. |
| DHT Bootstrap | Acts as entry point to the distributed hash table. Helps new peers discover content and other peers. | Sees DHT queries but not content. Like DNS — knows you're looking, not what you find. |
| Relay Fallback | Routes messages when direct P2P fails due to NAT. Maintains connection through firewalls. | Encrypted envelope only. Cannot read content or determine relationships. |
| Offline Queuing | Holds encrypted messages for offline community members. Delivers when they reconnect. | Time-limited storage. Auto-deletes after delivery or TTL expiry. |
Large communities can run dedicated boost nodes for their members. Faster file sharing within the community. Full control over retention policies.
Organizations and individuals who believe in private communication can contribute infrastructure. Similar to Tor relay operators.
Users with always-on servers or NAS devices can run boost nodes to help the network and improve their own connectivity.
Bootstrap nodes operated to ensure network availability during early growth. Designed to become less necessary over time.
Even if a boost node operator is malicious, they gain nothing. All content is encrypted before reaching the boost node. No keys are ever transmitted. The worst a rogue operator can do is delete data — they cannot read it.
Umbra Communities bring the best of Discord and Slack to a privacy-first platform. Large groups can collaborate with channels, roles, and permissions — all end-to-end encrypted.
Figure 9: Community structure — Spaces, channels, roles, and encryption layers
| Feature | Description | Privacy Implementation |
|---|---|---|
| Spaces | Organize channels into categories (like Discord categories). Collapse/expand for navigation. | Space metadata encrypted. Relay sees only encrypted community blob. |
| Text Channels | Persistent chat rooms. Thread support for focused discussions. Emoji reactions. | All messages E2E encrypted with community group key. |
| Voice Channels | Real-time voice chat with push-to-talk or voice activation. Screen sharing. | WebRTC P2P with DTLS-SRTP. Audio never touches servers unencrypted. |
| File Channels | Dedicated channels for file sharing. Folder organization. Version history. | Per-file encryption keys. Chunked P2P transfer. Boost node caching. |
| Roles & Permissions | Custom roles with granular permissions. Channel-specific overrides. Role hierarchy. | Permission data encrypted. Role assignments visible only to members. |
| Moderation Tools | Mute, ban, warning system. Audit logs for admins. Slow mode. Auto-mod via plugins. | Mod actions encrypted. No external visibility. Community self-governs. |
Each community has a shared group key. Messages encrypted with this key. Key rotates when members leave, ensuring departed members can't read new messages.
Communities are not discoverable publicly. Access only via invite links shared by members. Links can be time-limited or single-use.
Admins can manage channels and roles but cannot read members' DMs. Even community admins don't have backdoor access to private conversations.
Community state synced via encrypted events through relays. No central server holds the authoritative copy. Members' devices collectively maintain state.
| Aspect | Discord/Slack | Umbra Communities |
|---|---|---|
| Message Storage | All messages on company servers, readable by employees | E2E encrypted, stored on member devices only |
| File Sharing | Files uploaded to CDN, scanned, stored indefinitely | P2P transfer, encrypted chunks, member-controlled |
| Voice Calls | Routed through company servers, potentially recorded | P2P WebRTC, DTLS-SRTP encrypted, never on servers |
| Member Data | Email, IP, activity logs collected and monetized | Cryptographic identity only, no PII required |
| Compliance Requests | Can hand over all community data to authorities | Nothing to hand over — data doesn't exist on servers |
| Platform Ban Risk | Entire community can be deleted by platform decision | No central authority can delete your community |
Traditional platforms can ban entire communities overnight based on opaque "terms of service" decisions. With Umbra, your community exists on members' devices — no corporation can delete it, censor it, or hold it hostage.
Transparency is a core value. While we believe Umbra offers significant advantages, we also acknowledge the challenges and tradeoffs of our approach:
| Challenge | Impact | How We're Addressing It |
|---|---|---|
| NAT Traversal Complexity | Some users behind strict firewalls may struggle with direct P2P connections | Relay fallback ensures messages always deliver. TURN servers for voice/video. Ongoing WebRTC improvements. |
| Offline Message Delivery | If both peers are rarely online simultaneously, messages may be delayed | Relay queuing with 7-day TTL. Boost nodes extend availability. Push notifications when messages waiting. |
| Device Storage Requirements | Messages stored locally means your device needs sufficient storage | Configurable retention policies. Smart cleanup suggestions. Storage manager with one-click optimization. |
| Recovery Phrase Responsibility | Lose your 24 words = lose your identity forever. No "forgot password" option. | Clear onboarding warnings. Multiple backup prompts. Future: social recovery via trusted contacts. |
| Early Network Size | P2P benefits increase with more users. Early adopters may rely more on relays. | Strategic boost node placement. Geographic relay distribution. Network strengthens as it grows. |
| Challenge | Reality | Our Approach |
|---|---|---|
| Network Effect Barrier | Messaging apps are only useful if your contacts use them too | Focus on community use cases where groups migrate together. Easy invite links. Cross-platform support. |
| Convenience vs Privacy Tradeoff | Phone number login is familiar. Recovery phrases require more responsibility. | Make UX as smooth as possible. Progressive disclosure of complexity. Don't sacrifice privacy for convenience. |
| Feature Parity Gap | Established platforms have years of feature development | Plugin ecosystem lets community add features. Focus on core experience first. Open development. |
| Trust in New Platform | Why trust a new platform over established ones? | 100% open source. Auditable cryptography. Actions speak louder — we architecturally cannot access your data. |
Web version has 2GB file size limit due to browser memory constraints. Desktop app has no limits. We encourage power users to use native apps.
By design, we cannot recover your account. Your recovery phrase is the only key. We're exploring social recovery options for future releases.
Decentralization means no platform-level moderation. Communities must self-moderate. This is a feature for privacy, but requires active community management.
P2P connections and local encryption use more device resources than server-based apps. Modern devices handle this well, but older hardware may notice impact.
Every platform has tradeoffs. We believe the privacy and ownership benefits of Umbra's architecture far outweigh these challenges. But we respect users enough to be honest about what we're building and what we're still improving. We'd rather under-promise and over-deliver than hide limitations behind marketing speak.
| Feature | Umbra | Signal | Telegram | Discord | Slack | Matrix | |
|---|---|---|---|---|---|---|---|
| E2E Encryption (Default) | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ◐ |
| No Phone/Email Required | ✓ | ✗ | ✗ | ✗ | ◐ | ✗ | ✓ |
| Self-Sovereign Identity | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Zero-Knowledge Servers | ✓ | ◐ | ✗ | ✗ | ✗ | ✗ | ◐ |
| No Metadata Collection | ✓ | ◐ | ✗ | ✗ | ✗ | ✗ | ◐ |
| Open Source (Full Stack) | ✓ | ✓ | ✗ | ◐ | ✗ | ✗ | ✓ |
| Feature | Umbra | Signal | Telegram | Discord | Slack | Matrix | |
|---|---|---|---|---|---|---|---|
| Decentralized/P2P | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
| Direct Peer Connections | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Self-Hosted Option | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
| Federated Relays | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
| Recovery Without Server | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ◐ |
| Account Portability | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ◐ |
| Feature | Umbra | Signal | Telegram | Discord | Slack | Matrix | |
|---|---|---|---|---|---|---|---|
| Max File Size (Desktop) | ∞ | 100MB | 2GB | 2GB | 500MB | 1GB | 100MB |
| Max File Size (Mobile) | 2GB | 100MB | 100MB | 2GB | 25MB | 1GB | 100MB |
| P2P File Transfer | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Per-File Encryption | ✓ | ◐ | ◐ | ✗ | ✗ | ✗ | ◐ |
| Resume Interrupted Transfers | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ |
| Files Stay on Your Device | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ◐ |
| Feature | Umbra | Signal | Telegram | Discord | Slack | Matrix | |
|---|---|---|---|---|---|---|---|
| Communities/Servers | ✓ | ✗ | ◐ | ◐ | ✓ | ✓ | ✓ |
| Voice/Video Calls | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Plugin/Bot Ecosystem | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ | ◐ |
| Community-Maintained Plugins | ✓ | ✗ | ✗ | ✗ | ◐ | ✗ | ◐ |
| Sandboxed Plugin Execution | ✓ | — | — | ✗ | ✗ | ✗ | — |
| Custom Themes | ✓ | ✗ | ✗ | ✓ | ◐ | ✗ | ✓ |
| Native Desktop Apps | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Aspect | Umbra | Signal | Telegram | Discord | Slack | Matrix | |
|---|---|---|---|---|---|---|---|
| Revenue Model | Open Source | Donations | Meta/Ads | Premium | Nitro/Ads | Subscription | Foundation |
| Data Monetization | ✗ | ✗ | ✓ | ◐ | ✓ | ◐ | ✗ |
| Corporate Parent | None | Foundation | Meta | Private | Public Co | Salesforce | Foundation |
| Shutdown Risk | Low | Medium | Low | Medium | Medium | Low | Low |
✓ = Full support · ◐ = Partial/Limited · ✗ = Not supported · ∞ = Unlimited
Umbra's technical architecture directly translates to tangible user benefits:
| What You Get | How Architecture Enables It |
|---|---|
| Your data stays on your devices | P2P messaging + local-first storage |
| No account to be banned/deleted | Self-sovereign identity via recovery phrase |
| Export all data anytime | Open database format + no server dependency |
| Works without internet | Offline-first design with sync on reconnect |
| Traditional Risk | Umbra Solution |
|---|---|
| Company shuts down → lose everything | P2P + local storage → data persists |
| Platform pivots → features removed | Plugin ecosystem → community maintains |
| Price increases → pay or leave | Open source → run your own relay |
| Terms change → accept or lose access | Self-sovereign → identity is yours forever |
No phone number links identity. Messages never touch corporate servers. Share large document archives directly. Recovery phrase = portable secure identity.
Share unlimited file sizes (video, design files, datasets). Community spaces with channels and roles. Plugin integrations for workflows. No per-seat licensing.
Same features as mainstream apps. No advertising, no data mining. No social graph analysis possible. Full control over digital identity.
Build custom plugins for your community. Share code repositories without size limits. Integrate with development workflows via SDK. Open-source everything.
Umbra represents a fundamental rethinking of how private messaging platforms should be built. By combining:
Umbra delivers a messaging platform that does not compromise between privacy and usability. Users enjoy the features they expect from modern messaging — group chats, communities, voice/video calls, unlimited file sharing — while maintaining cryptographic guarantees that their communications remain private.
Visit umbra.chat to try Umbra in your browser, or download native apps from GitHub Releases.
| Resource | Link |
|---|---|
| Source Code | github.com/InfamousVague/Umbra |
| RFC 8032 (Ed25519) | datatracker.ietf.org/doc/html/rfc8032 |
| RFC 7748 (X25519) | datatracker.ietf.org/doc/html/rfc7748 |
| NIST SP 800-38D (AES-GCM) | csrc.nist.gov/publications/detail/sp/800-38d/final |
| RFC 5869 (HKDF) | datatracker.ietf.org/doc/html/rfc5869 |
| BIP-39 Specification | github.com/bitcoin/bips/blob/master/bip-0039.mediawiki |
| W3C DID:key Method | w3c-ccg.github.io/did-method-key |