You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Status honesty + real HMAC attestation; refuse fake asymmetric keys (#75)
## What & why
Two related honesty problems flagged by the survey, threat model, and
`STATE.a2ml`: dashboards that overstate status, and cryptography that
isn't what its labels claim.
## Changes
**B1 — status reconciliation (docs)**
- `TOPOLOGY.md` advertised "OVERALL 100% v1.0 Production Ready" while
`STATE.a2ml` records 60% / CRG grade **D** and `READINESS.md` grades it
**D (Alpha, Unstable)**. Rewrote the completion dashboard to summarise
the real state and name the actual caveats (homerolled MAC, label-only
asymmetric crypto, obliteration not guaranteed on SSD/CoW, formal proofs
pending).
- Added an **ARCHIVED** banner to the stale `TESTING-REPORT.adoc`
(2025-12-29) whose "all tests passed / robust" framing overstates
status.
**B3 — real attestation MAC (code)**
- Replaced the homerolled `SHA256(key || data || previous_hash)` (not a
MAC; banned by Trustfile `no-homerolled-hmac`) with a real
**HMAC-SHA256** (`hmac` crate, RFC 2104) with a versioned domain
separator.
- `compute_attestation` now returns `Result` and **hard-errors** when no
key is set, removing the `unwrap_or([0u8; 32])` all-zero-key fallback
that silently produced forgeable attestations. Producer and verifier
both propagate the error.
**B4 — no fake asymmetric crypto (code)**
- `SecretKey::generate()` only produces 32 random bytes and ignores the
algorithm, so `ed25519`/`x25519` yielded a random blob merely *labelled*
asymmetric. Generation of these types is now **refused** at the CLI with
a clear "not implemented" error. Enum variants are retained (documented
reserved/unimplemented) for backward-compatible deserialization.
## Verification
- `cargo build -p januskey` — clean (pre-existing dead-code warnings
only).
- `cargo test -p januskey --lib` — **26 passed / 0 failed**; attestation
E2E + P2P chain-integrity pass.
- New regression tests: `test_attestation_refused_without_key`,
`test_attestation_is_genuinely_keyed` (wrong key fails verification —
proves the MAC is genuinely keyed, which a plain hash would not catch).
- `STATE.a2ml` blockers updated (`homerolled-hmac` → RESOLVED).
## Context
Tasks **B1/B3/B4** of a broader estate assessment. Draft pending human
review. Note: on-disk audit logs written under the old homerolled scheme
will not verify under the new versioned MAC (intentional, alpha-stage).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_015qwVESTcbfanY2iJPQNoSz
---
_Generated by [Claude
Code](https://claude.ai/code/session_015qwVESTcbfanY2iJPQNoSz)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: .machine_readable/6a2/STATE.a2ml
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -53,8 +53,8 @@ compatibility = false
53
53
54
54
[blockers]
55
55
threat-model-signoff = "threat-model.a2ml status = draft-pending-human-review (since 2026-04-19); blocks any januskey-mcp cartridge"
56
-
homerolled-hmac = "attestation.rs SHA256(key||data) pattern flagged by threat model; must be replaced with a real HMAC primitive before MCP exposure (Trustfile no-homerolled-hmac)"
homerolled-hmac = "RESOLVED: attestation.rs now uses a real HMAC-SHA256 (hmac crate, RFC 2104) with a versioned domain separator, and hard-errors instead of the unwrap_or([0u8;32]) unkeyed fallback. Regression tests: test_attestation_refused_without_key, test_attestation_is_genuinely_keyed. Satisfies Trustfile no-homerolled-hmac."
57
+
metadata-only-key-types = "PARTIALLY MITIGATED: Ed25519/X25519 key generation is now refused at the CLI (was silently producing 32 random bytes mislabelled as an asymmetric key); enum variants retained only for backward-compatible deserialization. Real dalek-backed sign/DH still unimplemented."
58
58
claude-md-maintainer-edits = ".claude/CLAUDE.md is guardrail-blocked for agents: line 46 still says 'Julia/Rust/ReScript' (leftover from #49); package-management section still cites flake.nix, removed by the estate wave"
59
59
idris2-in-ci = "just test-proofs requires the idris2 binary; proof check not yet wired as a CI gate (READINESS D→C promotion item)"
Copy file name to clipboardExpand all lines: TESTING-REPORT.adoc
+14-2Lines changed: 14 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,15 +2,27 @@
2
2
// Copyright (c) Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
3
3
// SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell
4
4
5
-
= JanusKey Testing Report
5
+
= JanusKey Testing Report (ARCHIVED — 2025-12-29)
6
6
:toc: auto
7
7
:icons: font
8
8
:source-highlighter: rouge
9
9
:date: 2025-12-29
10
10
11
+
[WARNING]
12
+
====
13
+
*This report is a stale snapshot from 2025-12-29 and is retained for
14
+
history only.* It predates the 2026-04 readiness assessment, which graded
15
+
the project *D (Alpha, Unstable)*. Its "all tests passed / robust and
16
+
functional" framing overstates the current state (homerolled attestation
17
+
MAC, unimplemented asymmetric crypto, no fuzz/mutation/chaos testing).
18
+
19
+
*For the current, authoritative test status see `READINESS.md` and
20
+
`.machine_readable/6a2/STATE.a2ml`.*
21
+
====
22
+
11
23
== Executive Summary
12
24
13
-
This report documents the comprehensive testing of the JanusKey project, a reversible file operations system with cryptographic key management. All tests passed successfully, demonstrating a robust and functional implementation.
25
+
This report documents the testing of the JanusKey project as of 2025-12-29, a reversible file operations system with cryptographic key management. The tests recorded here passed at that time; see the archival warning above for why this no longer reflects project status.
0 commit comments