Commit 69c303f
committed
fix(crypto): use real HMAC-SHA256 for attestations; refuse fake asymmetric keys
Two honesty/security fixes flagged by the threat model and STATE.a2ml.
B3 — attestation MAC:
- Replace the homerolled `SHA256(key || data || previous_hash)` (not a MAC;
banned by the Trustfile `no-homerolled-hmac` invariant) with a real
HMAC-SHA256 via the `hmac` crate (RFC 2104), with a versioned scheme
label bound in as a domain separator (januskey.attestation.HMAC-SHA256.v1).
- `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, unkeyed attestations.
- Producer (log_event) and verifier (verify_integrity) both propagate the
error, so they stay consistent.
B4 — fake asymmetric crypto:
- `SecretKey::generate()` only ever produces 32 random bytes and ignores
the algorithm, so selecting ed25519/x25519 yielded a random blob merely
labelled "Ed25519"/"X25519" — not a keypair. Refuse generation of these
types at the CLI with a clear "not implemented" error. Enum variants are
retained (documented as reserved/unimplemented) so historical serialized
metadata and audit entries still deserialize.
Regression tests added: test_attestation_refused_without_key,
test_attestation_is_genuinely_keyed (wrong key fails verification — a plain
hash would not catch this, proving the MAC is genuinely keyed).
Verified: `cargo build -p januskey` clean; `cargo test -p januskey --lib`
26 passed / 0 failed; attestation E2E + P2P chain-integrity tests pass.
STATE.a2ml blockers updated (homerolled-hmac RESOLVED).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qwVESTcbfanY2iJPQNoSz1 parent acd9b8c commit 69c303f
6 files changed
Lines changed: 122 additions & 19 deletions
File tree
- .machine_readable/6a2
- crates/januskey-cli
- src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
56 | | - | |
57 | | - | |
| 56 | + | |
| 57 | + | |
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| 21 | + | |
21 | 22 | | |
22 | 23 | | |
23 | 24 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
| |||
118 | 119 | | |
119 | 120 | | |
120 | 121 | | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
121 | 126 | | |
122 | 127 | | |
123 | 128 | | |
| |||
179 | 184 | | |
180 | 185 | | |
181 | 186 | | |
182 | | - | |
183 | | - | |
184 | | - | |
185 | | - | |
186 | | - | |
187 | | - | |
188 | | - | |
189 | | - | |
190 | | - | |
191 | | - | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
192 | 224 | | |
193 | 225 | | |
194 | 226 | | |
| |||
211 | 243 | | |
212 | 244 | | |
213 | 245 | | |
214 | | - | |
| 246 | + | |
215 | 247 | | |
216 | 248 | | |
217 | 249 | | |
| |||
408 | 440 | | |
409 | 441 | | |
410 | 442 | | |
411 | | - | |
| 443 | + | |
412 | 444 | | |
413 | 445 | | |
414 | 446 | | |
| |||
552 | 584 | | |
553 | 585 | | |
554 | 586 | | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
555 | 632 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
63 | 63 | | |
64 | 64 | | |
65 | 65 | | |
| 66 | + | |
66 | 67 | | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
67 | 71 | | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
68 | 75 | | |
69 | 76 | | |
70 | 77 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
279 | 279 | | |
280 | 280 | | |
281 | 281 | | |
282 | | - | |
283 | | - | |
284 | | - | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
285 | 288 | | |
286 | | - | |
287 | | - | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
288 | 293 | | |
289 | 294 | | |
290 | 295 | | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
291 | 299 | | |
292 | 300 | | |
293 | 301 | | |
| |||
0 commit comments