Device Pairing API
Device pairing authenticates new devices using cryptographically random one-time codes with TTL expiry. Once paired, devices gain authorization to perform actions.Pairing Flow
The pairing flow follows these steps:- Generate pairing code - Server creates a 6-digit one-time code
- Display code - Show code to user (e.g., on screen, terminal)
- Device verification - Device submits code for verification
- Grant access - Device receives identity and is added to paired devices
Core Methods
generate_pairing_code()
Generate a cryptographically random 6-digit one-time pairing code.
crates/oneclaw-core/src/security/traits.rs:83
Returns:
Result<String>- 6-digit numeric code (e.g.,"042815")
OneClawError::Security- If RNG fails or lock is poisoned
verify_pairing_code()
Verify a pairing code and return device identity. Code is consumed (one-time use).
crates/oneclaw-core/src/security/traits.rs:86
Parameters:
code: &str- The 6-digit pairing code to verify
Result<Identity>- Device identity with unique device ID
OneClawError::Security("Invalid pairing code")- Code not foundOneClawError::Security("Pairing code already used")- Code was already verifiedOneClawError::Security("Pairing code expired")- Code TTL expired
Identity Type
Successful pairing returns anIdentity:
crates/oneclaw-core/src/security/traits.rs:42
- device_id: Unique UUID v4 identifier for the device
- paired_at: Timestamp when pairing occurred
PairingManager Implementation
ThePairingManager handles code generation and verification.
Source: crates/oneclaw-core/src/security/pairing.rs:20
Constructor
crates/oneclaw-core/src/security/pairing.rs:28
Parameters:
code_ttl_seconds- How long codes remain valid (seconds)
- Production: 300 seconds (5 minutes)
- Development: 3600 seconds (1 hour)
Code Generation Algorithm
crates/oneclaw-core/src/security/pairing.rs:8
- Uses
ringcrate’sSystemRandomfor cryptographic randomness - Generates uniform distribution over 000000-999999
- Zero-padded to ensure 6 digits
Verification Process
Theverify() method atomically checks and consumes codes:
crates/oneclaw-core/src/security/pairing.rs:53
Validation steps:
- Acquire lock on code registry
- Check if code exists
- Check if code was already used
- Check if code expired (TTL)
- Mark code as used
- Generate new UUID v4 device ID
- Return Identity
Pairing State Management
In-Memory Cache
Paired devices are stored in memory:crates/oneclaw-core/src/security/default.rs:23
Persistent Storage
Devices can be persisted to SQLite:crates/oneclaw-core/src/security/default.rs:29
Atomic Grant Flow
Theverify_and_grant() method ensures atomicity:
crates/oneclaw-core/src/security/default.rs:120
Guarantees:
- Code is marked used before granting access
- Lock poison recovery prevents grant failure
- Persistence failure doesn’t block pairing
Usage Examples
Basic Pairing Flow
Handling Invalid Codes
Code Expiry
One-Time Use Enforcement
With SQLite Persistence
Listing Paired Devices
Removing Paired Devices
Security Considerations
Cryptographic Randomness
- Uses
ring::rand::SystemRandomfor cryptographic-quality randomness - 6 digits = 1,000,000 possible codes
- Combined with TTL expiry prevents brute-force attacks
TTL Expiry
- Codes expire after configured TTL
- Expired codes are automatically cleaned from registry
- Reduces attack window for code interception
One-Time Use
- Each code can only be verified once
- Prevents replay attacks
- Code is marked used atomically during verification
Poison Recovery
- Lock poisoning doesn’t prevent device pairing
- Uses
unwrap_or_else(|e| e.into_inner())to recover - Ensures pairing succeeds after code is consumed
Configuration
Production Settings
Development Settings
Custom Settings
Best Practices
- Use short TTL in production - 5 minutes is recommended
- Display codes securely - Show on trusted display, not in logs
- Enable persistence - Use SQLite to survive restarts
- Handle errors gracefully - Invalid codes should not crash
- Audit pairing events - Log all pairing attempts
- Rotate codes frequently - Generate new code if not used quickly
See Also
- SecurityCore Trait - Trait definition and implementations
- Authorization API - Using paired devices for authorization