Add HTTPS identity rotation support
This commit is contained in:
@@ -31,7 +31,7 @@ particular, modeled failed commits retain predecessor storage; real flash fault
|
||||
and power-loss behavior needs target validation. No claim that NVS logical
|
||||
replacement securely erases historical flash pages.
|
||||
|
||||
The suite reports 15 production security groups plus one API/console static
|
||||
The suite reports 17 production security groups plus one API/console static
|
||||
absence check. Coverage includes fresh and stored-v2 paths, exact v1 migration,
|
||||
metadata/pair-copy bounds, NVS failures and retries, 21 legacy corruptions,
|
||||
14 v2 corruptions, unknown sizes, real bad signatures with recomputed hashes,
|
||||
@@ -44,7 +44,7 @@ intentionally retained.
|
||||
|
||||
## Integration/API contract
|
||||
|
||||
Five public functions remain:
|
||||
The five existing public functions remain:
|
||||
|
||||
- `web_security_init(web_security_load_result_t *)`
|
||||
- `web_security_copy_tls_material(...)` (unchanged pair-copy API)
|
||||
@@ -52,23 +52,40 @@ Five public functions remain:
|
||||
- `web_security_rotate_certificate(void)`
|
||||
- `web_security_reset_all(void)` (**TLS only**, changed signature)
|
||||
|
||||
8D.21 adds `web_security_get_identity_snapshot()` (zero-wait public fingerprint/
|
||||
generation only) and the owner-only reservation contract
|
||||
`web_security_reserve_identity()` / `web_security_replace_reserved()` /
|
||||
`web_security_release_identity()`. The API-symbol check includes all nine functions.
|
||||
New tests cover zero-wait contention, stale generations, one-use/nonreused tokens,
|
||||
reservation exhaustion and competing canonical rotate/reset/init during real crypto.
|
||||
Crypto/NVS runs outside the normal mutex during replacement; the identity reservation
|
||||
survives until its owner releases it after service stop/start.
|
||||
|
||||
`python3 tests/web_admin_transport/server_lifecycle.py` additionally links real
|
||||
production security and mbedTLS to the production HTTPS owner, with NVS/HTTPD doubles,
|
||||
for unchanged identity/storage before commit and no rollback after stop/start failure.
|
||||
See [8D.21 contracts and evidence limits](../../docs/phase8d21_implementation.md).
|
||||
|
||||
Removed: two credential functions (`show_credentials`, `rotate_credentials`),
|
||||
one credential struct type, three username/password capacity/length constants,
|
||||
and two console operations (`web credentials show`, `web credentials rotate`).
|
||||
There is no credential generation/display/synchronization path. Authentication
|
||||
continues to belong to the user database; read-only status does not mutate it.
|
||||
The integration owner must remove legacy startup callers in `main.c` and adapt
|
||||
other console policy/completion/UI/test callers outside this ownership scope.
|
||||
Legacy startup callers and console policy/completion integrations were removed in
|
||||
the accepted legacy-credential cleanup; this test does not reintroduce them.
|
||||
|
||||
Load results retain `STORED=0`, `GENERATED_MISSING=1`, and add `MIGRATED_V1=2`.
|
||||
Repeated successful init returns the remembered result without reloading.
|
||||
Repeated successful init returns the remembered result without reloading; an active
|
||||
identity reservation rejects init until its owner finishes.
|
||||
Migration must validate and commit before publication; no fallback generation
|
||||
or overwrite follows migration failure. Reset explicitly overwrites missing,
|
||||
valid, or incompatible material, increments a live generation or uses one when
|
||||
no live identity exists, and fails on live generation exhaustion. Rotation
|
||||
requires live material and also fails at `UINT32_MAX`.
|
||||
|
||||
`web reset --force` retains the old lifecycle: commit first; when running,
|
||||
CLI and browser-shell identity mutations now share `web_server_replace_identity()`
|
||||
service/security reservation composition. `web reset --force` retains the old
|
||||
lifecycle: commit first; when running,
|
||||
stop then start, with no start after failed stop; otherwise attempt start.
|
||||
Lifecycle failure does not roll back committed identity. Database accounts are
|
||||
never synchronized, reset or otherwise mutated by these operations.
|
||||
|
||||
Reference in New Issue
Block a user