|
All checks were successful
docs / build-and-deploy (push) Successful in 3s
The security-sensitive counterpart to the fast, non-cryptographic Hash.* library: standard, test-vector-backed hashing for signed saves and message integrity, kept in its own namespace so nobody reaches for the wrong tool. Crypto.sha256(s) SHA-256 -> 64-char lowercase hex Crypto.hmac_sha256(key, msg) HMAC-SHA256 -> 64-char hex Crypto.verify_hmac(key, msg, mac) recompute + constant-time compare -> bool Crypto.hex(s) lowercase hex of a string's bytes Crypto.ct_equal(a, b) constant-time string equality The primitives are implemented from scratch in plain integer LLVM IR (FIPS 180-4 / RFC 2104): no libc crypto, no data-dependent branches in the compression rounds, so a given input hashes to the same 32 bytes on every platform and run. Digests are returned as hex strings, not raw bytes, because a `str` is null-terminated and a raw digest can contain a NUL. MAC checks use a non-short-circuiting compare so timing does not leak how much of a forged tag was correct. Emitted on demand via g_uses_cryptort, mirroring the emit_hash prelude gate. Scoped to the deterministic, known-answer-testable core; OS-backed random_bytes (the one piece that can't be validated by test vectors) is left for a follow-up. Tested against published SHA-256 vectors (empty/"abc"/fox + 55/56/64-byte multi-block padding) and HMAC-SHA256 vectors; wired into the self-host suite as `crypto`. Docs: a new Crypto section with honest "what this protects / does not" guidance, one page per method, all fences checked and in the inventory. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| golden | ||
| tests | ||
| ast.ludic | ||
| buf.ludic | ||
| emit_addr.ludic | ||
| emit_collide.ludic | ||
| emit_color.ludic | ||
| emit_colorfn.ludic | ||
| emit_core.ludic | ||
| emit_crypto.ludic | ||
| emit_datetime.ludic | ||
| emit_decl.ludic | ||
| emit_ease.ludic | ||
| emit_ecs.ludic | ||
| emit_expr.ludic | ||
| emit_game.ludic | ||
| emit_hash.ludic | ||
| emit_head.ludic | ||
| emit_intrin.ludic | ||
| emit_intrin2.ludic | ||
| emit_list.ludic | ||
| emit_machine.ludic | ||
| emit_math.ludic | ||
| emit_mem.ludic | ||
| emit_net.ludic | ||
| emit_new.ludic | ||
| emit_query.ludic | ||
| emit_save.ludic | ||
| emit_spawn.ludic | ||
| emit_stmt.ludic | ||
| emit_text.ludic | ||
| emit_time.ludic | ||
| emit_ui.ludic | ||
| emit_vector.ludic | ||
| io.ludic | ||
| lex.ludic | ||
| ludicc.seed.ll | ||
| main.ludic | ||
| parse.ludic | ||
| parse_game.ludic | ||
| str.ludic | ||