| # ADR-0006: Server Challenge Protocol | |
| **Status:** Accepted | |
| **Date:** 2026-08-18 | |
| --- | |
| ## Decision | |
| When authorization is required, use explicit challenge/response protocol. | |
| ``` | |
| Client → Server: node_id + release_identity + nonce | |
| Server → Client: signature(authorization_token + timestamp + nonce) | |
| Client: Verify signature, use token for protected operation | |
| Token: Short-lived (1 hour), signed, includes nonce | |
| ``` | |
| ## Rules | |
| - Fresh nonces for replay protection | |
| - Short-lived tokens (1 hour max) | |
| - Signed responses (not encrypted secrets) | |
| - TLS for transport security | |
| - Explicit expiration timestamps | |
| - No client-side fallback if server unavailable | |
| ## What This Prevents | |
| - Replayed tokens | |
| - Token reuse across releases | |
| - Offline authorization generation | |
| - Casual modification of authorization state | |
| ## Consequences | |
| - Authorization is server-validated, not client-side | |
| - Private keys never transmitted | |
| - Compromised clone cannot manufacture valid tokens | |
| --- | |
| **Related ADRs:** | |
| - ADR-0002: Authorization Boundary | |
| - ADR-0004: Private Key Separation | |