WISEATA is structural deterministic processing of artifacts. It produces:
.wiseproof— a small text proof that travels with an artifact so anyone can re-derive its identity offline and confirm bytes haven't changed..wiseexp— a layered structural fingerprint that exposes how the artifact is shaped.
WISEATA is local-first. No servers, no accounts, no platform, no blockchain.
WISEATA is not a cryptographic security guarantee. It is structural, deterministic processing. v0.1.0 alone is not appropriate for high-stakes adversarial security. If your threat model includes well-funded adversaries, see "Algorithm choice" below and use --algorithm SHA-256.
WISEATA does not prove:
- Truth. A
.wiseproofdoes not say whether an artifact's contents are accurate, ethical, or correct. It says the bytes haven't changed since the proof was forged. - Authorship.
origin.creatoris a free-text label. Anyone can writeorigin.creator=Anthropicin a proof. Until the v0.4 identity/signature layer ships, that field is metadata, not attestation. - Origin authenticity. WISEATA does not verify who sealed the artifact.
- Time.
origin.created_atis declared, not verified. WISEATA does not consult a time authority. The cryptographicwise_sealcommits to whatever timestamp the creator chose. - Liveness. A proof from 2026 is still cryptographically valid in 2050; whether the artifact's contents should still be trusted is a policy decision outside the protocol.
- Confidentiality. A
.wiseproofexposes the artifact's size, name, creation time, creator label, algorithm, and digest. A.wisesealcarries the artifact in plaintext. A.wiseexpexposes byte-distribution statistics, the first/last/middle 16 bytes of the artifact, common bigrams, and run-length structure.
WISEATA supports two digest algorithms:
WiseDigest-0 is a 256-bit native digest defined in spec/WISEATA-v0.1.0.md §5. It has not undergone formal cryptanalytic review. It is included because the WISEATA protocol benefits from a self-contained, fully-specified primitive that any implementer can reproduce from the spec.
Specifically:
- No published collision-resistance analysis.
- No published preimage-resistance analysis.
- No third-party implementations to compare against.
- The construction is small, hand-rolled, and has not been peer-reviewed.
Do not rely on WiseDigest-0 for adversarial threat models.
SHA-256 is implemented via the host platform's standard library hash. SHA-256 is a NIST-standardized hash (FIPS 180-4) widely deployed in production systems. Pass --algorithm SHA-256 at forge time.
The same proof format and the same wise_id / wise_seal semantics apply with either algorithm.
For any threat model that requires collision resistance against well-funded adversaries, use
--algorithm SHA-256. Do not use v0.1.0 withWiseDigest-0alone for high-stakes security.
WiseDigest-1, WiseDigest-2, and WiseDigest-3 (in research/ and src/wise/digest_v[123].py) are research candidates. They are NOT wired into the live CLI. They are reachable only by direct import. They have the same disclaimer as WiseDigest-0: not formally reviewed. Do not use them in production.
| Attack | Status returned |
|---|---|
| Single-byte flip in artifact | TAMPERED |
| Truncation | TAMPERED |
| Extension (extra bytes appended) | TAMPERED |
\n ↔ \r\n newline conversion |
TAMPERED |
| Encoding conversion (UTF-8 ↔ UTF-16, etc.) | TAMPERED |
| Replacing artifact with a different file | TAMPERED |
Editing any field of a .wiseproof |
INVALID_PROOF |
| Deleting any required field of a proof | INVALID_PROOF |
| Reordering keys in a proof | INVALID_PROOF |
| Replacing the digest with a re-hashed one | INVALID_PROOF (wise_id and wise_seal will not reproduce) |
| Mismatched proof and artifact (replay) | TAMPERED |
Editing any field of a .wiseexp |
wisemark mismatch (verified by a future WiseMeasure) |
What WISEATA does NOT defend against:
- An attacker who controls both the artifact and the proof (they can make a fresh consistent pair anytime — that's why integrity is not authenticity).
- An attacker who replaces the verifier binary on your machine.
- Side-channel attacks on the hash implementation.
- Filesystem-level corruption that flips bytes in both files identically.
If you find a flaw in the protocol, the spec, the reference implementation, or the locked test vectors:
- Open a GitHub issue at
https://github.com/Wise-Est-Systems/wop/issuesfor non-sensitive bugs and protocol questions. - For anything that could let an attacker forge a
VERIFIEDoutcome on a divergent artifact, do not open a public issue. Use a private GitHub Security Advisory (Securitytab →Advisories→Report a vulnerability). - Include: WISEATA version (
wise --version), OS / Python version, minimal reproducer (artifact bytes in hex, the.wiseproofcontent, the command run), and your impact assessment.
We will acknowledge within 7 days. Default coordinated disclosure timeline is 90 days from acknowledgment.
Locked test vectors in tests/test_locked_vectors.py and tests/test_wisedigest_*.py are normative. They will not change within a 0.1.x release line. Any change that would alter a locked vector requires a new minor version, an entry in RELEASE_NOTES.md, and an updated section in this file.
v0.1.1 is a focused security-hardening patch addressing concrete findings from an adversarial review (cryptanalyst, parser-exploit, spec-pedant, supply-chain, integration, side-channel, privacy, and implementation- differential perspectives). Each change closes a named finding.
| Finding | Change | Why it matters |
|---|---|---|
| C2 | Reject all control chars (U+0000–U+001F, U+007F) in values | A malicious proof carrying ANSI escape sequences could hijack a terminal when displayed by wise inspect. |
| C3 | "Whitespace" = ASCII TAB or SPACE only; no Unicode-aware strip | str.strip() semantics differ between Python and Rust on Unicode whitespace. Two ports could disagree on the same proof. |
| C5 | Keys sorted by UTF-8 byte order, not codepoint order | Spec already required byte order; reference impl was using Python's default codepoint sort. Silent until first non-ASCII key. |
| C6 | Length-field bounds checks must use subtraction, not addition | A 32-bit port using pos + n > len overflows; subtraction never overflows. Mandatory for conformant ports. |
| C7 | Reject UTF-8 BOM (EF BB BF) |
A permissive Rust UTF-8 decoder might strip the BOM where Python doesn't, causing port disagreement. |
| H2 | origin.created_at strictly validated as ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$ AND a real calendar moment |
Previous behavior accepted "yesterday", "2099-99-99T...", etc. Now rejected. |
| H4 | Closed allow-set of permitted top-level keys | Unknown keys are an extension-confusion attack vector. v0.1.0 silently tolerated them. |
| H1/H5 | New required field origin.attestation (currently only self_declared); origin.creator restricted to printable ASCII |
Closes Unicode homoglyph impersonation (Cyrillic А = Latin A). v0.4 will add signed to the attestation enum. |
| Finding | Change | Why it matters |
|---|---|---|
| C1 | All recomputed-digest comparisons use hmac.compare_digest() |
Closes a timing side-channel: a non-constant-time compare leaks the expected digest one byte at a time to a network attacker measuring verifier latency. |
| C4 | Strict integer parsing (ASCII digits, no signs, no leading zeros) | Python int() accepts +5, 00005, 5, ٥. A Rust port using parse::<u64>() rejects them. Without this fix, ports disagree on the same proof bytes. |
| H3 | Hard 1 MiB cap on .wiseproof files at load time and on the embedded proof section in WISESEAL-V1 |
Closes memory-exhaustion DoS on the verifier. A real proof is well under 2 KiB. |
Adding origin.attestation could have invalidated the entire content-
addressing model. It does not. origin.attestation is in the
exclude set for wise_id, so:
For any artifact,
wise_idis unchanged from v0.1.0 to v0.1.1.
When v0.4 introduces signed proofs, the same property holds: a v0.4 signed
proof of artifact X has the same wise_id as a v0.1.1 self-declared
proof of artifact X. Content addressing survives the attestation upgrade.
wise_seal does change — that is its job. wise_seal commits to
attestation state because the per-sealing context includes "was this
self-declared or signed."
- WiseDigest-0 short-input avalanche weakness — A 1-byte input only
fully mutates 3 of 8 state lanes before finalize. Documented as a known
structural limitation; SHA-256 fallback recommended for adversarial use.
Will be addressed by promotion of WiseDigest-1/-2/-3 once one survives
sustained cryptanalysis. (See
research/WiseDigest-Lab.md.) - WiseDigest-0 ASCII-derived constants ("SPAS", "TRUE", "FAIL") are
designer-chosen — A "nothing up my sleeve" failure. Cryptographers
will rightly flag this. WiseDigest-2 and WiseDigest-3 explicitly forbid
borrowed and designer-chosen constants in their construction; promotion
path documented in
ROADMAP.md. - WiseExpansion privacy — A
.wiseexpexposes 48 bytes of artifact content verbatim plus full byte/bigram/run-length structure. Already disclosed; deserves more prominence. README and SECURITY.md now warn loudly: do not generate or share expansions of secret files. - No SLSA build provenance — CI runs tests but does not attest to build provenance. Planned for v0.2.0.
- PyPI name reservation — Reserve
wise-origin,wisespas,wiseataas a v0.1.1 release-day operational task to block name squatting.
If you find a way to bypass any of the v0.1.1 hardening (e.g., a proof
with an embedded ANSI escape that nonetheless reaches wise inspect,
or a wise_id collision under SHA-256), use the GitHub Security
Advisory path, not a public issue.