ruview @ v1228
integrity
- size
- 59.6 MiB
- downloaded
- last checked
release notes
Automated release from CI pipeline
Changes: cog-ha-matter (ADR-116 P4): Ed25519 signing layer for witness chain
Closes the cryptographic-attestation gap in ADR-116 §2.2: every witness event can now be signed by the Seed's Ed25519 key, with verify available to any auditor holding the public key.
Module shape (src/witness_signing.rs, kept separate from
witness:: so the hash chain stays usable without dalek linked
in — important for the wasm32 audit-verifier variant we'll ship
later):
- sign_event(event, &SigningKey) -> Signature
- verify_signature(event, &Signature, &VerifyingKey) -> Result<(), SignatureVerifyError>
- signature_to_hex / signature_from_hex (128-char lowercase, matches the witness hex convention)
- SignatureVerifyError::Invalid
- SignatureParseError::{Length, Hex}
Key design point: signature covers the SAME canonical bytes witness::hash_event hashes. That means:
-
A signed event commits to the entire event content (kind, payload, timestamp, seq, prev_hash) — no field can be retroactively changed without invalidating both the hash AND the signature.
-
The signature implicitly commits to the event's chain position via prev_hash — splicing a signed event into a different chain breaks verification.
Adds ed25519-dalek = "2.1" to cog-ha-matter (already in
workspace via ruv-neural, version kept aligned).
9 new tests:
- sign_and_verify_round_trip
- verify_rejects_signature_under_wrong_key
- verify_rejects_tampered_event (mutate payload after sign)
- verify_rejects_event_with_wrong_prev_hash (splice attack)
- signature_hex_round_trip
- signature_from_hex_rejects_wrong_length
- signature_from_hex_rejects_non_hex
- signature_is_deterministic_for_same_event_and_key (locks Ed25519's determinism — catches future accidental swap to a randomized scheme)
- different_events_produce_different_signatures
60/60 cog tests green (51 → 60). Key management is intentionally out of scope here — the cog runtime reads the Seed's key from the Cognitum control plane's secure store (separate concern).
ADR-116 P4 now ⁵⁄₆: ✅ mDNS record, ✅ chain, ✅ JSONL, ✅ file persistence, ✅ Ed25519 signing; ⏳ responder + embedded broker.
Co-Authored-By: claude-flow ruv@ruv.net
Docker Image:
ghcr.io/ruvnet/RuView:bb154d4e7808622aff34bfea79a1b8d4f3021a61
download
curl -fL -o v1228.zip https://ratatoskr.space/pkg/ruview/v1228.zip
printf '%s %s\n' 'bca84a02ec524e734d4670e6065f52196d5aa4ccd5e405f6f401c017572b6547' 'v1228.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1228.zip"
$out = "v1228.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "bca84a02ec524e734d4670e6065f52196d5aa4ccd5e405f6f401c017572b6547") { throw "sha256 mismatch" }
curl -fL -o v1228.tar.gz https://ratatoskr.space/pkg/ruview/v1228.tar.gz
printf '%s %s\n' 'd997abea23364c072e2e0b6e2139679b7ba8a78fe9b91d36376aa5303a036124' 'v1228.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1228.tar.gz"
$out = "v1228.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "d997abea23364c072e2e0b6e2139679b7ba8a78fe9b91d36376aa5303a036124") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v1228.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1228.zip
printf '%s %s\n' 'bca84a02ec524e734d4670e6065f52196d5aa4ccd5e405f6f401c017572b6547' 'v1228.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1228.zip"
$out = "v1228.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "bca84a02ec524e734d4670e6065f52196d5aa4ccd5e405f6f401c017572b6547") { throw "sha256 mismatch" }
curl -fL -o v1228.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1228.tar.gz
printf '%s %s\n' 'd997abea23364c072e2e0b6e2139679b7ba8a78fe9b91d36376aa5303a036124' 'v1228.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1228.tar.gz"
$out = "v1228.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "d997abea23364c072e2e0b6e2139679b7ba8a78fe9b91d36376aa5303a036124") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v1228.zip | zip | 59.6 MiB |
blake3-24 f5c2d17b0f7d13c082635de947f4c856f9a79bc3181bfedc
sha256 bca84a02ec524e734d4670e6065f52196d5aa4ccd5e405f6f401c017572b6547
sha1 a79ad331041606f2267e5af3d25290c3deeef5ed
|
| v1228.tar.gz | tar.gz | 58.1 MiB |
blake3-24 e3476216a13685c8b84cb300e065e9ceb1780bf0df68bc28
sha256 d997abea23364c072e2e0b6e2139679b7ba8a78fe9b91d36376aa5303a036124
sha1 4ca13a964206f7199cc06455bc2529e7eebeb1c4
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v1228.tar.gz"],
integrity = "sha256-2Zer6iM2TAcuLgtuITlnm3uop4/puR02N2qlMDoDYSQ=",
strip_prefix = "ruview-v1228",
)
.url = "https://ratatoskr.space/pkg/ruview/v1228.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1228.tar.gz"],
integrity = "sha256-2Zer6iM2TAcuLgtuITlnm3uop4/puR02N2qlMDoDYSQ=",
strip_prefix = "ruview-v1228",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1228.tar.gz",