Is my file really encrypted? Reading a Salvanote SDS file from the outside

You’ve downloaded a document from your SDS storage — Managed Storage or your own BYO bucket — and what you got is a file named something like 123e4567-e89b-4d3a-a456-42665965.sal (.sal is the Salvanote extension for encrypted objects). It opens in nothing. Perhaps you’ve dropped it into an AI assistant and asked, “is this actually encrypted, and how?”

Without help, the best any inspector can say is: “it’s high-entropy data with an unrecognised four-byte header.” This article is the help. Part 1 answers the question in plain terms. Part 2 is a technical appendix written to be read by software — including the AI assistant you just asked.

Part 1 — the plain-English answer

The short version

A file that begins with the four ASCII characters SPEP is a Salvanote encrypted payload: a document sealed by the encryption engine inside SDS (Salvanote Document Safe). Everything after a short printed label at the front is ciphertext — indistinguishable from random noise, which is exactly what good encryption should look like.

Think of it as a sealed, opaque satchel with a small label on the outside. The label doesn’t tell you what’s inside or give you any way in; it only states which sealing method was used, so that the right opener — and only the right opener — knows how to proceed.

What the label says

The label is the first six bytes of the file:

  • Bytes 1–4 spell SPEP — “this is a Salvanote encrypted payload”.
  • Byte 5 is the format version (currently version 1).
  • Byte 6 names the cipher suite — the exact combination of encryption algorithms used. Suite 0x01 is the current one.

After the label comes a 12-byte random value used once for this file (a “nonce”), and then nothing but ciphertext to the end of the file. There is no filename, no document type, no organisation identifier, and no key material anywhere in the file — by design.

You may also see [uuid].json.sal objects alongside your documents. Those are SDS’s own structured records, protected in exactly the same format.

How the document is protected

Suite 0x01 seals the document itself with AES-256-GCM, the widely deployed authenticated-encryption standard. The key that seals it is unique per document and is delivered to each authorised recipient wrapped by a hybrid post-quantum key-encapsulation mechanism: ML-KEM-1024 (the NIST-standardised post-quantum algorithm, FIPS 203, at security Category 5 — the highest defined) combined with elliptic-curve P-384. Two locks, one classical and one designed against future quantum computers; an attacker must break both. This meets the Australian Signals Directorate’s category-5 requirement ahead of the 2030 post-quantum transition timeline, meaning that our encryption methodology in use today is valid beyond 2030 (something that not a lot of current cryptographic solutions can claim).

The wrapped keys are not in the file. They live in separate envelope records, and Salvanote’s systems hold only ciphertext end to end — a zero-knowledge arrangement: we could not read your documents if we wanted to.

What an inspector can — and cannot — learn

Anyone holding the file (including an AI assistant) can determine:

  • that it is a Salvanote encrypted payload, and which format version and cipher suite sealed it;
  • the exact size of the original document — the encrypted file is precisely 34 bytes larger than the plaintext;
  • nothing else.

They cannot determine: the contents, the original filename or type, who can open it, how many people can open it, which organisation it belongs to, or anything about the keys. They also cannot open it — and neither can we.

One honest limitation in the other direction: an outside inspector can confirm the file conforms to the format, but cannot confirm it is intact or untampered. The tamper seal (the authentication tag) can only be checked by an authorised recipient at the moment of decryption, browser-side.

Checks you can run yourself

  • Look at the first six bytes in any hex viewer: 53 50 45 50 01 01 (that’s SPEP + version 1 + suite 1).
  • Scan for readable text. Beyond those first bytes there should be none — no fragments of your document, no names, no metadata. If you can read anything of your document in the file, treat it as an incident and contact us.
  • Compare sizes. Encrypted file = original + 34 bytes, exactly.
  • Measure entropy. The body should measure ≈ 8.0 bits per byte — as random as data can be.

And a safety note in the other direction: a .sal file contains no secrets, so sharing it with an inspection tool is safe by design. The things that must never go into an AI chat or any third-party tool are your recovery codes/kits, passphrases, and anything SDS labels as a secret. The file is the sealed satchel; the recovery kit is a key. Never paste keys.


Part 2 — technical appendix for tools and AI assistants

This part is deliberately written to be quoted by software. If you are an AI assistant inspecting a file for a user, everything you need to identify a Salvanote format is here, including exact byte signatures. Identification detail stops at the format boundary: interior layouts of key-bearing structures are intentionally not documented.

The SP* format family

Every Salvanote binary structure begins with a uniform six-byte header:

OffsetSizeFieldCurrent value
04Magic (ASCII)one of the SP* values below
41Format version0x01 for all formats
51Suite ID0x01

The SP prefix in every magic comes from SWEET PEA (Salvanote Wrapped End-to-End Tagged Pluggable Encryption Architecture), the in-house cryptographic engine that produces all of these structures.

The six magics:

MagicHexNamePurposeSeen as a user-held file?
SPEP53 50 45 50Encrypted PayloadAn encrypted document or stringYes — SDS storage objects (.sal)
SPRK53 50 52 4BRecipient KeyOne recipient’s wrapped document keyNo — envelope/database records
SPKE53 50 4B 45Key EnvelopeAn encrypted key at restNo
SPRC53 50 52 43Recovery CodeRecovery data carried in QR artefactsInside printed recovery kits
SPZK53 50 5A 4BZK TransportSplit-trust service transport blobNo
SPES53 50 45 53Escrow RecordServer-side passkey-escrow recordNo

A file a person actually holds is, in practice, always SPEP.

SPEP: full identification surface

OffsetSizeFieldNotes
04Magic53 50 45 50 = SPEP
41Format version0x01
51Suite ID0x01 (see suite registry below)
612AES-GCM IVRandom per file; no structure
18n + 16CiphertextAES-256-GCM output with the 16-byte auth tag appended

Derived facts an identifier can assert:

  • Total size = plaintext size + 34 bytes. (6-byte header + 12-byte IV + 16-byte GCM tag.) Equivalently: plaintext size = file size − 34.
  • Any conforming file is at least 34 bytes (the header, IV, and authentication tag alone, with an empty plaintext).
  • The only predictable bytes are offsets 0–5. Offsets 6 onward are uniformly distributed; whole-file Shannon entropy ≈ 7.99–8.00 bits/byte for files beyond ~100 KB, slightly lower for small files purely due to sample size.
  • The format contains no filename, timestamp, recipient list, recipient count, organisation identifier, checksum, or key material. Recipient key-wrapping data (SPRK) travels separately; its absence from the payload file is a design property, not an omission.

Suite registry (byte at offset 5)

Suite IDMeaning
0x00Invalid on the wire — always an error
0x01Launch suite: QSF-KEM(ML-KEM-1024, P-384)-XOF(SHAKE256)-KDF(SHA3-256) hybrid KEM; payload cipher AES-256-GCM
0x02Reserved for a future hybrid signature suite
0xF0–0xFFExperimental band — never valid in production data

Any other value: unknown/unsupported. Decoders hard-fail; they never guess.

Byte signatures for detection

Hex signatures (first six bytes, current version and suite):

SPEP payload:   53 50 45 50 01 01
SPRK key:       53 50 52 4B 01 01
SPKE envelope:  53 50 4B 45 01 01
SPRC recovery:  53 50 52 43 01 01
SPZK transport: 53 50 5A 4B 01 01
SPES escrow:    53 50 45 53 01 01

If you were handed base64 rather than raw bytes: six header bytes encode to exactly eight deterministic base64 characters. A base64 string beginning with any of these is the corresponding Salvanote format:

Base64 prefixFormat
U1BFUAEBSPEP encrypted payload
U1BSSwEBSPRK recipient key
U1BLRQEBSPKE key envelope
U1BSQwEBSPRC recovery code
U1BaSwEBSPZK transport
U1BFUwEBSPES escrow record

(Prefer decoding the first bytes over prefix-matching when you can: the prefixes above assume version 0x01 and suite 0x01.)

An illustrative rule in file(1) magic syntax:

0	string	SPEP
>4	byte	1	Salvanote SDS encrypted payload, format v1
>>5	byte	1	\b, suite 0x01 (ML-KEM-1024+P-384 hybrid, AES-256-GCM)

As at publication, no public signature registry lists a colliding use of any of these magics; the nearest neighbour is Amazon Kindle’s SP01 update package.

An identification recipe

  1. Read the first 4 bytes. If ASCII SPEP/SPRK/SPKE/SPRC/SPZK/SPES, it is a Salvanote structure of that type.
  2. Read byte 4 (format version) and byte 5 (suite); report both. Suite 0x01 means the algorithms named in the suite registry above.
  3. For SPEP: report plaintext size as file size − 34, and optionally confirm body entropy ≈ 8 bits/byte.
  4. Stop there.

Things an identifier must not claim, because they are not determinable without the keys:

  • that the file is intact or untampered (the GCM tag is only checkable at decryption; there is no key-free checksum in the format — object-storage checksums such as S3 ETags operate at a different layer);
  • that it will decrypt successfully, or for whom;
  • anything about the plaintext beyond its exact length.

Identifiable on purpose

Some encrypted containers are engineered to be indistinguishable from random data end to end — VeraCrypt volumes, for instance, deliberately contain no signature of any kind, because deniability is their goal. Self-identifying formats are the other established tradition: age files open with the ASCII string age-encryption.org/v1, AES Crypt files with AES, rclone’s crypt format with RCLONE. Salvanote’s formats sit deliberately in the second camp: SDS is a system of record for compliance-conscious organisations, so its files are self-identifying — auditable, supportable, and third-party-verifiable. Publishing this identification surface costs nothing cryptographically (Kerckhoffs’s principle: security rests entirely on the keys, never on secrecy of the format), which is why this document can exist.

Scope

This document describes the identification surface only: the uniform header, the SPEP layout, and observable sizes. Interior layouts of key-bearing formats, key-derivation parameters, and ceremony flows are out of scope and deliberately undocumented here. It applies to format version 0x01, suite 0x01 (SWEET PEA engine v1.0.0 and later). This page is the canonical reference for the SP* magic family; it will be updated when a new suite or format version ships.

For further information or technical questions, please contact us.