# EncryptID
**Unified Identity System for the r-Ecosystem**
EncryptID is a self-sovereign identity system built on WebAuthn passkeys, with derived cryptographic keys and social recovery. It provides a consistent login experience across all r-ecosystem apps: rspace.online, rwallet, rvote, rmaps, and rfiles.
## Features
- **🔑 Passkey Authentication** - Hardware-backed, phishing-resistant login
- **🔐 Client-Side Encryption** - Keys derived locally, never leave your device
- **🛡️ Social Recovery** - No seed phrases! Recover with trusted guardians
- **🌐 Cross-App SSO** - One identity for all r-ecosystem apps
- **💰 Web3 Ready** - Integrated with Account Abstraction smart wallets
## Quick Start
### Installation
```bash
npm install @rspace/encryptid
# or
pnpm add @rspace/encryptid
# or
bun add @rspace/encryptid
```
### Basic Usage
```typescript
import {
registerPasskey,
authenticatePasskey,
getKeyManager,
getSessionManager,
} from '@rspace/encryptid';
// Register a new passkey
const credential = await registerPasskey('user@example.com', 'User Name');
// Authenticate with passkey
const result = await authenticatePasskey();
// Initialize key derivation
const keyManager = getKeyManager();
if (result.prfOutput) {
await keyManager.initFromPRF(result.prfOutput);
}
// Get derived keys
const keys = await keyManager.getKeys();
console.log('Your DID:', keys.did);
// Create session
const session = getSessionManager();
await session.createSession(result, keys.did, {
encrypt: true,
sign: true,
wallet: false,
});
```
### UI Components
```html
```
```typescript
// Import to register custom elements
import '@rspace/encryptid/ui/login-button';
import '@rspace/encryptid/ui/guardian-setup';
```
## Architecture
```
┌─────────────────────────────────────────────────────────────┐
│ ENCRYPTID LAYERS │
├─────────────────────────────────────────────────────────────┤
│ │
│ Layer 5: Applications │
│ ├── rspace.online (canvas) │
│ ├── rwallet (treasury) │
│ ├── rvote (voting) │
│ ├── rfiles (storage) │
│ └── rmaps (mapping) │
│ │
│ Layer 4: Session & SSO │
│ └── JWT tokens, cross-app authentication │
│ │
│ Layer 3: Smart Wallet (Account Abstraction) │
│ └── ZeroDev Kernel + Passkey Validator │
│ │
│ Layer 2: Derived Keys (WebCrypto) │
│ ├── Encryption Key (AES-256-GCM) │
│ ├── Signing Key (ECDSA P-256) │
│ └── DID Key (Ed25519 → did:key) │
│ │
│ Layer 1: Primary Authentication (WebAuthn) │
│ └── Passkeys (platform + roaming authenticators) │
│ │
└─────────────────────────────────────────────────────────────┘
```
## Modules
### webauthn.ts
WebAuthn/passkey registration and authentication with PRF extension support.
```typescript
import {
registerPasskey,
authenticatePasskey,
detectCapabilities,
startConditionalUI,
} from '@rspace/encryptid';
```
### key-derivation.ts
Cryptographic key derivation using WebCrypto API.
```typescript
import {
getKeyManager,
encryptData,
decryptData,
signData,
verifySignature,
} from '@rspace/encryptid';
```
### session.ts
Session management with authentication levels.
```typescript
import {
getSessionManager,
AuthLevel,
canPerformOperation,
} from '@rspace/encryptid';
```
### recovery.ts
Social recovery with guardians (no seed phrases!).
```typescript
import {
getRecoveryManager,
GuardianType,
} from '@rspace/encryptid';
```
## Social Recovery
EncryptID uses guardian-based recovery instead of seed phrases:
1. **Add Guardians** - Choose 5 trusted entities:
- Secondary passkey (backup device)
- Trusted contacts (friends/family with EncryptID)
- Hardware key (offline backup)
- Institutional guardian (service provider)
2. **Recovery Threshold** - Require 3 of 5 guardians to approve
3. **Time-Lock** - 48-hour delay before recovery completes (you can cancel)
4. **Privacy** - Guardians don't know each other's identities
```typescript
const recovery = getRecoveryManager();
// Add a guardian
await recovery.addGuardian({
type: GuardianType.TRUSTED_CONTACT,
name: "Alice",
weight: 1,
contactEmail: "alice@example.com",
});
// Initiate recovery (if device lost)
const request = await recovery.initiateRecovery(newCredentialId);
// Guardian approves
await recovery.approveRecovery(guardianId, signature);
// Complete after time-lock
await recovery.completeRecovery();
```
## Security Levels
Operations require different authentication levels:
| Level | Description | Example Operations |
|-------|-------------|-------------------|
| BASIC | Session token only | View public content |
| STANDARD | Recent WebAuthn (15 min) | Edit boards, upload files |
| ELEVATED | Fresh WebAuthn (1 min) | Sign votes, approve transactions |
| CRITICAL | Fresh + explicit consent | Add guardians, export keys |
```typescript
const session = getSessionManager();
// Check if operation is allowed
const { allowed, reason } = session.canPerform('rvote:cast-vote');
if (!allowed) {
// Re-authenticate for elevated access
await authenticatePasskey();
session.upgradeAuthLevel(AuthLevel.ELEVATED);
}
```
## Cross-App SSO
EncryptID uses [Related Origin Requests](https://passkeys.dev/docs/advanced/related-origins/) to share passkeys across r-ecosystem domains.
Configuration at `https://encryptid.online/.well-known/webauthn`:
```json
{
"origins": [
"https://rspace.online",
"https://rwallet.online",
"https://rvote.online",
"https://rmaps.online",
"https://rfiles.online"
]
}
```
## Browser Support
| Feature | Chrome | Safari | Firefox | Edge |
|---------|--------|--------|---------|------|
| WebAuthn | ✅ | ✅ | ✅ | ✅ |
| Discoverable Credentials | ✅ | ✅ | ✅ | ✅ |
| PRF Extension | ✅ | ✅ | ❌ | ✅ |
| Related Origins | ✅ | ✅ | ❌ | ✅ |
| Conditional UI | ✅ | ✅ | ⚠️ | ✅ |
For browsers without PRF support, EncryptID falls back to passphrase-based key derivation.
## Events
Login button component emits events:
```typescript
const button = document.querySelector('encryptid-login');
button.addEventListener('login-success', (e) => {
console.log('Logged in:', e.detail.did);
});
button.addEventListener('login-error', (e) => {
console.error('Login failed:', e.detail.error);
});
button.addEventListener('logout', () => {
console.log('User logged out');
});
```
Guardian setup component emits events:
```typescript
const setup = document.querySelector('encryptid-guardian-setup');
setup.addEventListener('guardian-added', (e) => {
console.log('Guardian added:', e.detail.name);
});
setup.addEventListener('guardian-removed', (e) => {
console.log('Guardian removed:', e.detail.id);
});
```
## Development
```bash
# Install dependencies
bun install
# Run demo
bun run dev
# Build
bun run build
# Test
bun test
```
## License
MIT
## Links
- [Specification](./docs/ENCRYPTID-SPECIFICATION.md)
- [Demo](./src/encryptid/demo.html)
- [r-Ecosystem](https://rspace.online)