release: restore ZUPT and harden source-only 5.2.2

This commit is contained in:
Cristian Cezar Moisés 2026-08-31 14:14:36 -03:00
commit ff99770bd0
205 changed files with 19627 additions and 13215 deletions

View file

@ -1,127 +0,0 @@
.\" Manpage for vaptvupt-gui (formerly zupt-gui; INPI Brasil trademark rename in v3.0.0)
.\" SPDX-License-Identifier: AGPL-3.0-or-later
.\" Copyright (c) 2025-2026 Cristian Cezar Moisés
.TH VAPTVUPT-GUI 1 "2026-06-11" "vaptvupt-gui 1.3.0" "User Commands"
.SH NAME
vaptvupt-gui \- graphical interface for the VaptVupt post-quantum backup utility
.SH SYNOPSIS
.B vaptvupt-gui
.RI [ ARCHIVE ]
.SH DESCRIPTION
.B vaptvupt-gui
is a graphical frontend for
.BR vaptvupt (1).
It provides tabs for compression, extraction, key management, and
full-disk backup. Both PQ encryption modes are exposed:
.B legacy --pq
and
.B SDK v2 --pq-sdk
(HKDF combiner, key commitment, HPKE binding, Argon2id).
The legacy command name
.B zupt-gui
is preserved as a symlink for backward compatibility; both invocations
behave identically.
If
.I ARCHIVE
is given on the command line, the GUI opens directly on the
extract tab with that archive preloaded.
.B vaptvupt-gui
uses Qt 6. It works with either of the following Python Qt bindings,
auto-detected at startup in this order:
.IP \(bu 2
PySide6 (Qt for Python)
.IP \(bu 2
PyQt6
.PP
If neither is installed, the GUI prints an instructive error and exits.
.SH TABS
.TP
.B Compress
Select files or directories, choose codec, level, password and/or PQ
key. The
.B Mode
panel controls whether the SDK v2 path or the legacy path is used.
.TP
.B Extract
Open a .zupt archive, select output directory, provide password
and/or PQ private key.
.TP
.B Keygen
Generate ML-KEM-768 + X25519 keypair. The
.B SDK v2 format
checkbox controls whether the keypair is generated via
.B vaptvupt keygen --sdk
(producing
.IR file
and
.IR file.pub
in one step) or via the legacy
.BR "vaptvupt keygen" .
.TP
.B Disk
Full-disk backup and restore. Enumerates block devices with
human-readable sizes. Same encryption mode controls as Compress.
.SH FILES
.TP
.I /usr/bin/vaptvupt-gui
Wrapper script that invokes the Python entry point (and the symlinked
legacy
.IR /usr/bin/zupt-gui ).
.TP
.I /usr/lib/vaptvupt-gui/zupt_gui.py
Main Python source.
.TP
.I /usr/share/applications/vaptvupt-gui.desktop
Desktop entry for menu integration.
.TP
.I /usr/share/icons/hicolor/256x256/apps/vaptvupt-gui.png
Application icon.
.SH ENVIRONMENT
.TP
.B VAPTVUPT_BIN
Override the path to the
.B vaptvupt
binary (default: search
.IR PATH ).
The legacy name
.B ZUPT_BIN
is also honoured.
.TP
.B VAPTVUPT_DEBUG
Enable binary-discovery debug logging on stderr. The legacy name
.B ZUPT_DEBUG
is also honoured.
.SH BUGS
Report at
.UR https://git.securityops.co/cristiancmoises/vaptvupt/issues
.UE .
.SH AUTHOR
Cristian Cezar Moisés
.MT zupt@riseup.net
.ME
.SH SEE ALSO
.BR vaptvupt (1).
.SH LICENSE
.PP
vaptvupt-gui is licensed under the
.B GNU Affero General Public License version 3 or later
(AGPL-3.0-or-later). Commercial license available for relief from
copyleft terms; contact
.MT sac@securityops.co
.ME .
.SH PROJECT
.PP
Home page:
.UR https://git.securityops.co/cristiancmoises/vaptvupt
.UE

View file

@ -1,730 +0,0 @@
.\" Manpage for vaptvupt (formerly zupt; INPI Brasil trademark rename in v3.0.0)
.\" SPDX-License-Identifier: AGPL-3.0-or-later
.\" Copyright (c) 2025-2026 Cristian Cezar Moisés
.TH VAPTVUPT 1 "July 2026" "vaptvupt 5.0.0" "User Commands"
.SH NAME
vaptvupt \- post-quantum backup compression utility (formerly zupt)
.SH SYNOPSIS
.B vaptvupt compress
.RI [ options ]
.I out.zupt
.I files...
.br
.B vaptvupt extract
.RI [ options ]
.I archive.zupt
.br
.B vaptvupt list
.RI [ options ]
.I archive.zupt
.br
.B vaptvupt test
.RI [ options ]
.I archive.zupt
.br
.B vaptvupt info
.I archive.zupt
.br
.B vaptvupt bench
.I files/dirs...
.br
.B vaptvupt disk backup
.RI [ options ]
.I out.zupt
.I device
.br
.B vaptvupt disk restore
.RI [ options ]
.I archive.zupt
.I device
.br
.B vaptvupt keygen
.RI [ options ]
.br
.B vaptvupt version
.br
.B vaptvupt help
.PP
The legacy command name
.B zupt
is preserved as an alias for backward compatibility; both invocations
behave identically.
.SH DESCRIPTION
.B vaptvupt
compresses and encrypts files, directories, and whole block devices
into self-contained, authenticated archives with the
.B .zupt
extension. It targets long-lived backup storage where:
.RS
.IP \(bu 2
the archive is written once and restored under time pressure many years later;
.IP \(bu 2
the encryption envelope must remain secure against a future cryptographically-relevant quantum computer (ML-KEM-768);
.IP \(bu 2
every byte of the archive — header, footer, per-block metadata, comments — is authenticated, and a single bit-flip is rejected at restore time.
.RE
.PP
The compression layer is the
.B VaptVupt LZ + ANS
codec (version 2.60.4), which prioritises decode speed and ratio over
encode speed. Aggregate decode throughput on this build is 1.27\(mu
zstd\-3; encode throughput is 0.2\(mu\(en0.5\(mu zstd\-3 depending on
content. See
.B PERFORMANCE
below.
.PP
The on-disk format is v1.6 and has been wire-compatible since release
v2.3.1. The product was renamed from
.B Zupt
to
.B VaptVupt
in v3.0.0 because of a prior INPI Brasil trademark registration of the
name "Zupt" for unrelated software. The
.B .zupt
file extension and the
.B ZUPT
header magic bytes are unchanged: archives produced by any v2.x release
extract cleanly under v3.0.0 and vice versa.
.SH COMMANDS
.TP
.B compress
Create an archive. Default codec is VaptVupt (level 7). Compression
is multi-threaded; one worker per detected CPU by default.
.TP
.B extract
Decompress an archive into the current directory (or
.BR -o " " \fIdir\fR ).
Refuses to write outside the destination directory (path-traversal
defence). Files are written with their original permissions and
mtime preserved.
.TP
.B list
Print archive metadata: per-file path, size, mtime, mode, compressed
size, codec. With
.B --verbose
also prints per-block sizes and HMAC tags (first 8 bytes).
.TP
.B test
Decompress all blocks in memory and verify HMAC tags + archive
integrity trailer. Does not write any files. Use to validate an
archive without restoring it. Exit code is non-zero on any failure.
.TP
.B info
Print archive header metadata without requiring the decryption key.
Reports: format version, codec, encryption type (none / PBKDF2 /
Argon2id / ML-KEM-768+X25519 hybrid / ML-KEM-768 pure-PQ), KDF
iteration count, file count,
creation timestamp, archive UUID, AIT presence. Safe to run on an
untrusted archive.
.TP
.B bench
Compare compression levels 1\(en9 on the supplied files; reports
ratio and encode/decode throughput per level. Useful when picking
the right
.B -l
for a given workload.
.TP
.B disk backup
Read a block device and write a sparse-aware archive. Detects
all-zero regions and records them as runs rather than compressing
them.
.TP
.B disk restore
Inverse of
.BR "disk backup" .
Writes the archive's contents back to a block device. Verifies
target device size before writing; refuses if the target is smaller
than the archived size. With
.B --sync
issues
.BR fsync (2)
after each block.
.TP
.B keygen
Generate a key file. With no PQ flag, writes a 32-byte raw key for
keyfile-mode encryption. With
.B --pq
generates a native ML-KEM-768 + X25519 \fBhybrid\fR keypair for
.B --pq
encryption (in-tree crypto; no external library). With
.B --pq-only
generates a native pure ML-KEM-768 keypair (magic
.BR ZPQK )
for
.B --pq-only
encryption. With
.B --sdk
generates a keypair for the optional
.B --pq-sdk
mode, and with
.B --box
a libpqvaptvupt sealed-box keypair for
.B --pq-box
(both need a
.B WITH_SDK=1
build). With
.B --pub
extracts the public key from an existing private key (combine with the
matching PQ flag, e.g.
.BR "keygen --pub --pq-only" ).
.SH GLOBAL OPTIONS
.TP
.BR -v ", " --verbose
Print per-file and per-block details during compress/extract/list/test.
.TP
.BR -q ", " --quiet
Suppress non-error output.
.TP
.BR -j " " \fIN\fR ", " --jobs " " \fIN\fR
Worker thread count for parallel compression. Default: number of
online CPUs.
.SH COMPRESS OPTIONS
.TP
.BR -l " " \fI1..9\fR ", " --level " " \fI1..9\fR
Compression level. 1\(en2 = ultra-fast (~80 MB/s encode on typical
hardware, lower ratio). 3\(en7 = balanced (default 7). 8\(en9 =
extreme (optimal parsing, ~5\(en10\(mu slower encode, best ratio).
.TP
.B --codec \fIid\fR
Force a specific codec by id. Accepted values:
.BR store " (0x0000), "
.BR vaptvupt-lz " (0x0008), "
.BR vaptvupt-lzh " (0x0009), "
.BR vaptvupt-lzhp " (0x000A), "
.BR vaptvupt " (0x0010 — default), "
.BR auto " (0xFFFF — pick at runtime)."
.TP
.BR -p " " \fIpassword\fR
Enable password-based encryption (PBKDF2-SHA256 KDF; Argon2id is available
only in a WITH_SDK=1 build via \fB--kdf argon2id\fR).
Reading the password from a flag exposes it in
.BR ps (1)
output; prefer
.B --pass-file
or interactive prompt.
.TP
.B --pass-file \fIpath\fR
Read password from the first line of the file. The file's permission
bits should be 0600.
.TP
.B --pass-fd \fIN\fR
Read password from file descriptor N.
.TP
.B --kdf \fIalgo\fR
Choose key-derivation function for password mode. In the default source-only
build the only KDF is
.BR pbkdf2 " (SHA-256, 600 000 iter), which is the default;"
.BR argon2id " (memory-hard) is available only in a " WITH_SDK=1 " build."
.TP
.B --keyfile \fIpath\fR
Use a 32-byte raw key file (generated with
.BR "vaptvupt keygen" ).
.TP
.B --pq \fIpub\fR
Enable native post-quantum \fBhybrid\fR encryption (envelope type 0x02,
recommended). Combines ML-KEM-768 (FIPS 203) with X25519 (RFC 7748) so
the archive key is secure unless \fBboth\fR the lattice KEM and the
elliptic-curve exchange are broken. Uses the in-tree crypto only — no
external library, always available. The
.I pub
argument is the recipient's public-key file from
.BR "vaptvupt keygen" .
On extraction, pass the secret key:
.B --pq
\fIpriv\fR.
.TP
.B --pq-only \fIpub\fR
Enable native \fBfull\fR (pure) post-quantum encryption (envelope type
0x06). ML-KEM-768 is the \fIsole\fR key-establishment mechanism — no
X25519 component. Choose this only when a policy mandates a single
NIST-standardised PQ primitive with no classical KEM in the envelope
(e.g. CNSA 2.0-style "PQ-only" postures). The archive key is
SHA3-512(ml_ss || ml_ct || "ZUPT-PQ-ONLY-v1"). Note the deliberate
trade-off: unlike
.BR --pq ,
a future weakness in ML-KEM-768 alone is sufficient to break the
envelope, because there is no classical KEM to fall back on. When in
doubt use
.B --pq
(hybrid). Keys are generated with
.BR "vaptvupt keygen --pq-only" ;
the private and public key files (magic
.BR ZPQK )
are not interchangeable with hybrid
.B --pq
keys. On extraction, pass the secret key:
.B --pq-only
\fIpriv\fR.
.TP
.B --pq-box \fIpub\fR
Enable post-quantum sealed-box encryption via libpqvaptvupt (envelope
type 0x05). \fBRequires an optional\fR \fBWITH_SDK=1\fR \fBbuild\fR: the
default source-only tree ships no vendored library, so this mode is
absent unless you build against libpqvaptvupt yourself. Prefer the
native
.B --pq
or
.B --pq-only
modes, which need no external library. ML-KEM-768 + X25519 shared secrets are
combined through HKDF-SHA256 with a domain-separating info string
("pqvv-seal-v1"); the box carries AES-256-CTR + HMAC-SHA256
Encrypt-then-MAC. The
.I pub
argument is the recipient's public-key file from
.B keygen --box
(magic-tagged; public and secret key files are not interchangeable).
On extraction, pass the secret key:
.B --pq-box
\fIpriv\fR.
.TP
.B --pq-sdk \fIpub\fR
Enable post-quantum hybrid encryption via libzuptsdk (envelope type
0x03). \fBRequires an optional\fR \fBWITH_SDK=1\fR \fBbuild\fR and is
absent from the default source-only tree; use the native
.B --pq
instead, which provides the same ML-KEM-768 + X25519 hybrid with no
external dependency. Uses ML-KEM-768 + X25519 with HKDF combiner, HPKE
binding, and key commitment. The
.I pub
argument is the recipient's public-key file generated by
.BR "vaptvupt keygen --sdk" .
.TP
.B -c \fItext\fR ", " --comment " " \fItext\fR
Embed an encrypted UTF-8 comment in the archive (up to 4096 bytes).
The comment is bound to the archive's frame-preface AAD; tampering
is detected at extract time.
.TP
.B --comment-file \fIpath\fR
Read the comment from a file rather than the command line.
.TP
.B -b \fIsize\fR ", " --block-size " " \fIsize\fR
Compression block size. Default 4 MiB. Smaller blocks improve
random-access decode but lose some ratio.
.SH EXTRACT, LIST, TEST OPTIONS
.TP
.BR -o " " \fIdir\fR ", " --output " " \fIdir\fR
Extract into
.IR dir
(created if it doesn't exist). Default: current directory.
.TP
.B --no-mtime
Do not restore archived modification times; use current time instead.
.TP
.B --strip-components \fIN\fR
Strip
.I N
leading path components from each entry, like
.BR tar 's
flag of the same name.
.SH POST-QUANTUM ENCRYPTION
.B vaptvupt
offers two native post-quantum modes, both built entirely from the
in-tree crypto (no external library):
.RS
.IP "\fB--pq\fR (hybrid, recommended)" 4
A hybrid KEM combining ML-KEM-768 (FIPS 203) with X25519 (RFC 7748).
The archive key is derived as:
.RS
.nf
ss_pq = ML-KEM-768.decaps(sk_pq, ct_pq)
ss_ec = X25519(sk_ec, pk_ec_peer)
session = HKDF-SHA256(ss_pq || ss_ec,
info = "vaptvupt-pq-sdk-v1",
salt = archive_uuid)
.fi
.RE
The hybrid combiner means the session key is at least as strong as the
strongest of {ML-KEM-768, X25519}: an attacker must break \fBboth\fR to
recover the key. This is the default recommendation and the right choice
for almost every user, because it stays secure even if one primitive is
later found weak.
.IP "\fB--pq-only\fR (full / pure PQ)" 4
ML-KEM-768 as the \fIsole\fR key-establishment mechanism, with no
classical component. The archive key is derived as:
.RS
.nf
(ss_pq, ct_pq) = ML-KEM-768.encaps(pk_pq)
archive_key = SHA3-512(ss_pq || ct_pq || "ZUPT-PQ-ONLY-v1")
.fi
.RE
Use this only when a compliance posture requires a single
NIST-standardised PQ primitive with no classical KEM in the envelope
(for example CNSA 2.0-style "PQ-only" requirements). The deliberate
trade-off is that the envelope has \fBno hybrid safety net\fR: a future
cryptanalytic break of ML-KEM-768 alone breaks the archive, whereas
under
.B --pq
the attacker would still have to break X25519 as well. Unless a policy
forbids the classical component, prefer
.BR --pq .
.RE
.PP
Both modes carry the same authenticated envelope as password mode:
per-block AES-256-CTR with a fresh random 128-bit nonce, HMAC-SHA256
Encrypt-then-MAC, and ML-KEM Fujisaki-Okamoto implicit rejection, so a
wrong or tampered ciphertext is rejected rather than yielding garbage.
.PP
.B Key commitment:
the ciphertext is bound to the exact public key it was encrypted to
via an HPKE-style derivation. An attacker cannot present a different
public key that decrypts to the same plaintext (this defeats the
"partitioning" attack class).
.PP
.B Implementation notes:
the ML-KEM-768 implementation is vendored from a clean reference and
verified against the FIPS 203 KAT vectors. The X25519 implementation
uses 4\(mu64-bit field arithmetic with Jasmin-verified constant-time
field operations on x86_64. On other architectures the same routines
run in pure C, also constant-time by construction.
.SH SECURITY
.SS Threat model
What
.B vaptvupt
.B protects against:
.RS
.IP \(bu 2
Confidentiality of archived data at rest (AES-256-CTR with HMAC-SHA256 EtM, or AEAD via libzuptsdk on the
.B --pq-sdk
path).
.IP \(bu 2
End-to-end byte-level tamper detection on encrypted archives. The F-09 byte-sweep regression (1827 positions on a representative archive, 2000 trials, every run) shows zero silent-accept positions.
.IP \(bu 2
Wrong-password and tampered-archive indistinguishability at the user-visible message layer (F-11). The default error wording is identical for both cases; only
.B --verbose
prints the distinguishing detail. This closes the "verbal probe-oracle" attack class where the error string leaked which check failed first.
.IP \(bu 2
Post-quantum forward secrecy on archives encrypted with
.B --pq-sdk
(assuming ML-KEM-768 holds against future quantum attack).
.IP \(bu 2
Archive-header and footer authentication via a 32-byte HMAC-SHA256 trailer (F-08). Tampering with the file count, comment offset, or timestamp is detected at archive open time.
.IP \(bu 2
Path-traversal at extract time. Entries with absolute paths or
.B ..
components are refused or stripped.
.RE
What it does
.B NOT
protect against:
.RS
.IP \(bu 2
Compromise of the endpoint that creates or restores the archive. If the host is compromised, the password, key file, or plaintext is accessible.
.IP \(bu 2
Compromise of the key file or password. Key custody is the user's responsibility.
.IP \(bu 2
A weak password. Argon2id with default parameters needs ~256 MiB and ~1 s to derive a key on commodity hardware; a 4-character password is still trivially crackable.
.IP \(bu 2
Metadata leakage. File names, sizes, and modification times are encrypted, but the archive's total size and the count of compressed blocks are visible to an observer.
.IP \(bu 2
Side channels on the compression layer (CRIME/BREACH-style). If the same archive contains both attacker-controlled and secret data and the attacker can observe the compressed size, length-based oracles may be possible.
.IP \(bu 2
Denial-of-service via malformed input on the decoder. The decoder rejects malformed input cleanly (no crashes in the fuzz harness), but a very large compressed input can still consume CPU and memory proportional to its size.
.RE
.SS Cryptographic primitives
.TS
tab(|);
l l.
SHA-256 | FIPS 180-4
SHA-3 / SHAKE | FIPS 202
ML-KEM-768 | FIPS 203
AES-256-CTR | NIST SP 800-38A
HMAC-SHA256 | RFC 2104 / FIPS 198-1
X25519 | RFC 7748
HKDF-SHA256 | RFC 5869
PBKDF2-SHA256 | RFC 8018
Argon2id | RFC 9106
XXH64 | non-cryptographic; used only inside the AEAD envelope
.TE
.SS Constant-time guarantees
All secret-dependent comparisons and table lookups in the cryptographic
core are constant-time. On x86_64 the hot paths (HMAC equality compare,
ML-KEM Fujisaki-Okamoto implicit rejection) are implemented in Jasmin
and assembled with
.BR jasminc (1).
On other architectures the same routines run in portable C; the
constant-time property is preserved by source-level construction.
.SH FILES
.TP
.I ~/.config/vaptvupt/
Per-user configuration directory (reserved; not used in v3.0.0).
.TP
.I /etc/vaptvupt/
System-wide configuration directory (reserved; not used in v3.0.0).
.TP
.I /usr/share/bash-completion/completions/vaptvupt
Bash completion (and the symlinked legacy
.IR /usr/share/bash-completion/completions/zupt ).
.TP
.I /usr/share/zsh/site-functions/_vaptvupt
zsh completion.
.TP
.I /usr/share/fish/vendor_completions.d/vaptvupt.fish
fish completion.
.SH ENVIRONMENT
.TP
.B VAPTVUPT_BIN
Override the binary path used by the GUI front-end. Legacy
.B ZUPT_BIN
is also honoured.
.TP
.B VAPTVUPT_DEBUG
If set to any non-empty value, the GUI front-end prints its binary-discovery log to stderr.
.SH EXIT STATUS
.TP
.B 0
Success.
.TP
.B 1
General error (bad arguments, file not found, etc.).
.TP
.B 2
Authentication failed. Wrong password, wrong key file, or the archive has been tampered with. Use
.B --verbose
to see the distinguishing detail (subject to F-11's threat model: detailed messages may leak which failure cause fired first).
.TP
.B 3
Archive-format error (wrong magic bytes, unsupported format version, corrupted header).
.TP
.B 4
I/O error (disk full, permission denied, network failure).
.TP
.B 5
Compressed-data integrity error (per-block HMAC mismatch detected mid-stream).
.SH PERFORMANCE
Numbers below are from the v3.0.0 release benchmark (May 2026), run
on an Intel Xeon @ 2.8 GHz with the codec compiled with the
distribution's default optimisation level.
.TS
tab(|);
l l l l l.
\fBFixture\fR | \fBTool\fR | \fBRatio\fR | \fBEnc MB/s\fR | \fBDec MB/s\fR
text 8 MB | vv-9 | 34.6% | 5.4 | 219
text 8 MB | gzip-9 | 30.9% | 6.2 | 137
text 8 MB | zstd-3 | 31.6% | 137 | 427
text 8 MB | zstd-19 | 25.5% | 1.6 | 384
source 670 KB | vv-9 | 25.1% | 11.4 | 128
source 670 KB | gzip-9 | 23.2% | 10.0 | 107
source 670 KB | zstd-3 | 24.1% | 91 | 160
binary 2.4 MB | vv-9 | 44.7% | 7.7 | 153
binary 2.4 MB | gzip-9 | 52.0% | 12.6 | 109
binary 2.4 MB | zstd-3 | 77.3% | 164 | 382
binary 2.4 MB | zstd-19 | 48.0% | 5.8 | 229
random 5 MB | vv-9 | 100.0% | 11.1 | 477
random 5 MB | zstd-3 | 100.0% | 397 | 681
.TE
.PP
Honest reading of these numbers:
.RS
.IP \(bu 2
On binary-structured data (game saves, mmap'd structures, struct arrays),
.B vaptvupt
beats zstd-3 by a wide margin on ratio (44.7% vs 77.3%) at the cost of being ~20\(mu slower to encode. For write-once / restore-often workloads this is the right trade.
.IP \(bu 2
On text and source, zstd-19 beats
.B vaptvupt
on ratio. The fundamental codec difference is that zstd's reference encoder has had years of compiler-engineering attention that
.B vaptvupt
has not.
.IP \(bu 2
Encode throughput is
.BR vaptvupt 's
weak axis. If encode latency matters more than ratio, use
.B -l 1
or
.BR -l 2 .
.IP \(bu 2
On random / already-compressed data, all codecs hit the incompressibility wall; comparing encode/decode throughput in that regime is mostly measuring memcpy speed plus framing overhead.
.RE
.SH EXAMPLES
.PP
Compress with default settings (PBKDF2-SHA256 password, VaptVupt level 7, multi-threaded):
.RS
.nf
$ vaptvupt compress -p secret backup.zupt ~/Documents
.fi
.RE
Compress with post-quantum hybrid encryption to a published public key:
.RS
.nf
$ vaptvupt keygen --sdk -o ~/.config/vaptvupt-mykey
$ vaptvupt keygen -o ~/.config/vaptvupt-mykey
$ vaptvupt keygen --pub -o mykey.pub -k ~/.config/vaptvupt-mykey
$ vaptvupt compress --pq mykey.pub backup.zupt ~/Documents
.fi
.RE
Compress with full (pure) post-quantum encryption — ML-KEM-768 only,
no classical component (compliance postures that mandate a single PQ
primitive):
.RS
.nf
$ vaptvupt keygen --pq-only -o pqkey
$ vaptvupt keygen --pub --pq-only -o pqkey.pub -k pqkey
$ vaptvupt compress --pq-only pqkey.pub backup.zupt ~/Documents
$ vaptvupt extract --pq-only pqkey -o restored backup.zupt
.fi
.RE
Backup a block device, sparse-aware:
.RS
.nf
$ sudo vaptvupt disk backup -p secret system.zupt /dev/nvme0n1p2
.fi
.RE
Verify an archive without restoring:
.RS
.nf
$ vaptvupt test -p secret backup.zupt
.fi
.RE
Print archive metadata without supplying a password:
.RS
.nf
$ vaptvupt info backup.zupt
.fi
.RE
Compare compression levels:
.RS
.nf
$ vaptvupt bench ~/Downloads/big-dataset.bin
.fi
.RE
Run the GUI from a desktop session where /usr/bin isn't on PATH (the bug fixed in v3.0.0):
.RS
.nf
$ VAPTVUPT_DEBUG=1 vaptvupt-gui 2> /tmp/discovery.log
.fi
.RE
.SH STANDARDS
ISO C11; POSIX.1-2017 for I/O and threading. The cryptographic
primitives implement the specifications listed in
.BR SECURITY
above. The on-disk archive format is documented in
.B FORMAT.md
in the source distribution.
.SH AUTHORS
Cristian Cezar Moisés <zupt@riseup.net> — primary author and maintainer.
.SH BUGS
Report bugs at https://git.securityops.co/cristiancmoises/vaptvupt/issues
or by email to <zupt@riseup.net>.
.SH LICENSE
AGPL-3.0-or-later for the application; GPL-3.0-or-later for the
embedded VaptVupt codec. Dual-licensed: a commercial licence is
available from <sac@securityops.co>.
.SH SEE ALSO
.BR vaptvupt-gui (1),
.BR zstd (1),
.BR gzip (1),
.BR xz (1),
.BR tar (1),
.BR cryptsetup (8),
.BR jasminc (1).
.PP
Project home: https://git.securityops.co/cristiancmoises/vaptvupt
.br
Threat model: see
.B THREAT_MODEL.md
in the source distribution.
.br
Archive format spec: see
.B FORMAT.md
in the source distribution.

View file

@ -1,127 +1,157 @@
.\" Manpage for vaptvupt-gui (formerly zupt-gui; INPI Brasil trademark rename in v3.0.0)
.\" SPDX-License-Identifier: AGPL-3.0-or-later
.\" Copyright (c) 2025-2026 Cristian Cezar Moisés
.TH VAPTVUPT-GUI 1 "2026-06-11" "vaptvupt-gui 1.3.0" "User Commands"
.TH ZUPT-GUI 1 "2026-08-31" "ZUPT 5.2.2" "User Commands"
.SH NAME
vaptvupt-gui \- graphical interface for the VaptVupt post-quantum backup utility
zupt-gui \- Qt interface for the ZUPT backup utility
.SH SYNOPSIS
.B vaptvupt-gui
.RI [ ARCHIVE ]
.SH DESCRIPTION
.B vaptvupt-gui
is a graphical frontend for
.BR vaptvupt (1).
It provides tabs for compression, extraction, key management, and
full-disk backup. Both PQ encryption modes are exposed:
.B legacy --pq
and
.B SDK v2 --pq-sdk
(HKDF combiner, key commitment, HPKE binding, Argon2id).
The legacy command name
.B zupt-gui
is preserved as a symlink for backward compatibility; both invocations
behave identically.
If
.I ARCHIVE
is given on the command line, the GUI opens directly on the
extract tab with that archive preloaded.
.B vaptvupt-gui
uses Qt 6. It works with either of the following Python Qt bindings,
auto-detected at startup in this order:
.IP \(bu 2
PySide6 (Qt for Python)
.IP \(bu 2
PyQt6
.RI [ ARCHIVE.zupt ]
.br
.B zupt-gui
.BI --compress " FILE ..."
.br
.B zupt-gui
.BI --extract " ARCHIVE.zupt"
.br
.B zupt-gui
.RB [ --help | --version | --selftest ]
.SH DESCRIPTION
.B zupt-gui
is a Python Qt 6 frontend for
.BR zupt (1).
It creates, inspects, verifies, and extracts archives by running the CLI as a
child process. It can also request CLI disk backup and restore operations.
The GUI does not implement an archive codec or cryptography itself.
.PP
If neither is installed, the GUI prints an instructive error and exits.
PySide6 is tried first and PyQt6 is used as a fallback. The selected
.B zupt
command is checked by executing
.BR "zupt version" .
The ZUPT command and environment variables are preferred; renamed-era names
are accepted only for compatibility with an existing installation.
.PP
When paired with the source-only baseline CLI, the frontend uses a build with
.B WITH_SDK=0
and
.BR WITH_PQBOX=0 .
Native password,
.B --pq
(ML-KEM-768 plus X25519), and
.B --pq-only
(ML-KEM-768) modes remain available. The GUI parses the CLI's
.B Build integrations:
line and exposes
.B --pq-sdk
or
.B --pq-box
only when libvuptsdk or libpqvaptvupt is independently reported enabled.
These two optional integrations are detected separately.
.PP
The gated 5.2.2 GUI release set is limited to the architecture-independent DEB,
noarch/source RPM, and source-only portable ZIP named in the project README.
Package gates require exact checks and installed off-screen GUI/CLI integration.
The portable ZIP receives source scans, an exact safe-member allowlist, and an
extracted launcher test; it bundles no Python, Qt, CLI, or compiled runtime.
AppImage, AppDir and Flatpak bundles and Windows/macOS GUI installers are not
promoted; the Windows ZIP and macOS DMG are CLI-only.
.PP
The GUI does not expose the CLI's recovery-only
.B --allow-legacy-no-ait
option. A known, trusted pre-AIT archive must be recovered explicitly with the
CLI; untrusted trailerless archives must remain rejected.
.SH OPTIONS
.TP
.B --compress
Open the Compress tab with the remaining arguments selected as inputs.
.TP
.B --extract
Open the Extract tab with the following archive selected.
.TP
.B --selftest
Create the complete interface, run the event loop briefly, and exit. A display
backend (or a suitable off-screen Qt backend) is still required.
.TP
.BR --version , " -V"
Print the GUI, Qt binding, CLI version, and selected CLI path.
.TP
.BR --help , " -h"
Print command-line usage.
.SH TABS
.TP
.B Keys
Generate and export recipient keys. Mode choices follow CLI capability
detection, including independent SDK and PQ-box choices when enabled.
.TP
.B Compress
Select files or directories, choose codec, level, password and/or PQ
key. The
.B Mode
panel controls whether the SDK v2 path or the legacy path is used.
Choose inputs, destination, codec options, password, and an optional recipient
public key.
.TP
.B Extract
Open a .zupt archive, select output directory, provide password
and/or PQ private key.
Choose an archive, output directory, and any required password or private key.
The GUI uses
.B zupt info
to auto-detect supported archive protection modes. That framing inspection is
unauthenticated and is only a mode-selection hint; the subsequent CLI extract
or test operation performs the required AIT and content validation.
.TP
.B Keygen
Generate ML-KEM-768 + X25519 keypair. The
.B SDK v2 format
checkbox controls whether the keypair is generated via
.B vaptvupt keygen --sdk
(producing
.IR file
and
.IR file.pub
in one step) or via the legacy
.BR "vaptvupt keygen" .
.B Verify
Inspect an archive header or run the CLI integrity test with the detected
credential type.
.TP
.B Disk
Full-disk backup and restore. Enumerates block devices with
human-readable sizes. Same encryption mode controls as Compress.
.SH FILES
Request full-device or image backup and restore through the CLI. Raw devices
may require operating-system privileges. Restore overwrites its selected target
and requires explicit confirmation in the GUI.
.TP
.I /usr/bin/vaptvupt-gui
Wrapper script that invokes the Python entry point (and the symlinked
legacy
.IR /usr/bin/zupt-gui ).
.TP
.I /usr/lib/vaptvupt-gui/zupt_gui.py
Main Python source.
.TP
.I /usr/share/applications/vaptvupt-gui.desktop
Desktop entry for menu integration.
.TP
.I /usr/share/icons/hicolor/256x256/apps/vaptvupt-gui.png
Application icon.
.B About
Show the detected CLI version and build information.
.SH ENVIRONMENT
.TP
.B VAPTVUPT_BIN
Override the path to the
.B vaptvupt
binary (default: search
.IR PATH ).
The legacy name
.B ZUPT_BIN
is also honoured.
Absolute or executable path to the preferred
.B zupt
command. It must pass the CLI version liveness check.
.TP
.B VAPTVUPT_DEBUG
Enable binary-discovery debug logging on stderr. The legacy name
.B ZUPT_DEBUG
is also honoured.
Print command-discovery diagnostics to standard error when non-empty.
.TP
.B ZUPT_NO_XCB_FALLBACK
Disable the guarded XWayland relaunch used when a Wayland window is never
exposed.
.TP
.BR VAPTVUPT_BIN , " VAPTVUPT_DEBUG" , " VAPTVUPT_NO_XCB_FALLBACK"
Renamed-era compatibility aliases for the corresponding ZUPT variables.
New integrations should use the ZUPT names.
.SH FILES
.TP
.I /usr/bin/zupt-gui
Installed launcher.
.TP
.I /usr/lib/zupt-gui/zupt_gui.py
GUI source location used by the DEB or source installer. The noarch RPM may use
an architecture-independent shared-data directory instead.
.TP
.I /usr/share/applications/zupt-gui.desktop
Desktop entry.
.PP
Distribution packages do not install a
.B vaptvupt-gui
alias. The source installer can create one only with its explicit
.B --legacy-alias
option. The optional alias has no separate manual page.
.SH BUGS
Report at
.UR https://git.securityops.co/cristiancmoises/vaptvupt/issues
Report reproducible issues at
.UR https://github.com/cristiancmoises/zupt/issues
.UE .
.SH AUTHOR
Cristian Cezar Moisés
.MT zupt@riseup.net
.ME
.SH SEE ALSO
.BR vaptvupt (1).
.SH LICENSE
.PP
vaptvupt-gui is licensed under the
.B GNU Affero General Public License version 3 or later
(AGPL-3.0-or-later). Commercial license available for relief from
copyleft terms; contact
.MT sac@securityops.co
.ME .
.SH PROJECT
.PP
Home page:
.UR https://git.securityops.co/cristiancmoises/vaptvupt
.UE
The current integrated GUI source carries AGPL-3.0-or-later notices. Published
historical revisions include MIT grants that remain applicable to the exact
material distributed under them. See
.I gui/LICENSE-GUI
and the 5.2.2 licensing erratum in
.I CHANGELOG.md
for scope and repository evidence.
.SH SEE ALSO
.BR zupt (1)

View file

@ -1 +0,0 @@
vaptvupt.1

634
doc/zupt.1 Normal file
View file

@ -0,0 +1,634 @@
.\" SPDX-License-Identifier: AGPL-3.0-or-later
.\" Copyright (c) 2025-2026 Cristian Cezar Moisés
.TH ZUPT 1 "2026-08-31" "ZUPT 5.2.2" "User Commands"
.
.SH NAME
zupt \- source-built backup compression and authenticated-encryption utility
.
.SH SYNOPSIS
.B zupt compress
.RI [ options ]
.I output.zupt input...
.br
.B zupt extract
.RI [ options ]
.I archive.zupt
.br
.B zupt list
.RI [ options ]
.I archive.zupt
.br
.B zupt test
.RI [ options ]
.I archive.zupt
.br
.B zupt info
.I archive.zupt
.br
.B zupt bench
.RB [ --compare ]
.I input...
.br
.B zupt disk backup
.RI [ options ]
.I output.zupt device-or-file
.br
.B zupt disk restore
.RI [ options ]
.I archive.zupt target-device-or-file
.br
.B zupt keygen
.RI [ key-options ]
.B -o
.I output
.br
.B zupt
.RB { help | --help | -h | version | --version | -V }
.
.SH DESCRIPTION
.B zupt
creates self-contained backup archives with the historical
.B .zupt
extension. Version 5.2.2 restores the original product name, ZUPT, and the
primary installed command is
.BR zupt .
The archive extension and
.B ZUPT
format magic, codec identifiers, and archive compatibility remain unchanged.
.
.PP
Plain archives provide compression checksums for accidental-corruption
detection. They do not provide cryptographic authentication against an attacker
who can rewrite an archive. Encrypted archives use AES-256-CTR with
HMAC-SHA256 and authenticate current per-block framing, logical frame position,
and archive metadata. The validating read paths require an archive-integrity
trailer by default; a no-trailer archive fails closed unless the caller selects
the explicit trusted-legacy override described below.
See
.B SECURITY.md
and
.B THREAT_MODEL.md
for the exact boundary and historical-format limitations.
.
.PP
The bundled compression codec is VaptVupt codec 2.65.3.
Automatic codec selection uses VaptVupt where the supported AVX2 or NEON path is available and
uses the portable LZHP codec otherwise. Use a codec-selection option only when
a specific choice is required.
.
.PP
The renamed-era
.B vaptvupt
command is an optional compatibility alias and is not installed by default.
Distribution packages, including the openSUSE main package, expose
.B zupt
as the canonical command.
.
.PP
Git and the upstream source tarball are source-only. Separately built CLI DEB,
binary RPM, SRPM, notice-bearing Linux tar.xz, Windows ZIP, and macOS DMG assets
may be published from the immutable tag only after their target-specific gates
pass; they never enter Git or the source tarball. An AppImage is not promoted
for 5.2.2; neither are AppDir/Flatpak bundles, GUI platform installers, or bare
Linux/Windows executables. The Python/Qt frontend remains available as source;
its gated architecture-independent DEB, noarch/source RPM, and source-only
portable ZIP are included in the release claim. The portable ZIP contains no
Python, Qt, CLI, or compiled runtime. Windows and macOS artifacts remain
CLI-only.
.
.SH COMMANDS
.TP
.BR compress , " c"
Create an archive from one or more files or directories. Directories are
traversed recursively. All options must precede
.IR output.zupt .
A literal input name beginning with a hyphen can follow a
.B --
separator after the output name.
.
.TP
.BR extract , " x"
Extract regular-file contents below the current directory or the directory
selected by
.BR -o .
Entry names are validated and resolved below a pinned destination. Existing
destination files are not overwritten. Decoded data is published from a
private temporary file only after its expected size and checksum are verified.
ZUPT does not restore ownership, ACLs, extended attributes, original mode,
or modification time.
.
.TP
.BR list , " l"
Open and verify the archive as required, then print its format, block and
protection flags followed by each entry's path, original size, compressed size,
and compression ratio. No file is extracted.
.
.TP
.BR test , " t"
Decode and verify the archive without writing extracted files. Exit status is
nonzero on an authentication, integrity, format, or I/O failure.
.
.TP
.BR info , " i"
Read non-secret framing metadata without a password or private key. Current
output includes archive size, format version, integrity-trailer type, UUID,
creation timestamp, block count when a footer is found, encryption/PQ mode,
selected global feature flags, and whether a comment is present. This command
does not decrypt, list, or extract entries. It does not validate the trailer or
archive contents: a reported trailer is framing information, and successful
execution is not an integrity result. Its input must still be treated as
untrusted.
.
.TP
.BR bench , " b"
Run the built-in compression-level benchmark on supplied input. With
.BR --compare ,
also compare external compressors available on the host. Results depend on the
input, compiler, CPU, storage, and system load and are not release support
claims.
.
.TP
.B disk backup
Read a device or regular file sequentially and create a sparse-aware archive.
Zero regions are represented without storing their full contents.
.
.TP
.B disk restore
Restore a disk-image archive to a device or regular file. The target is written
destructively; verify both operands and use the least privilege required. The
archive is first copied to a private, auto-deleted scratch file, and validation
and restoration consume that same snapshot before the target is opened. Set
.B ZUPT_TMPDIR
to an existing private scratch directory when needed; an invalid override fails
without fallback. A raw block device is rejected before the first write when
its capacity cannot be determined or is smaller than the restored image.
.
.TP
.B keygen
Generate a native ML-KEM-768 plus X25519 hybrid private key by default. Other
key formats require the matching key-generation option and, for optional SDK or
PQBOX modes, a build with the corresponding system integration enabled.
.
.TP
.BR version , " --version" , " -V"
Print the program, archive-format and codec versions, compiled optional
integrations, runtime CPU acceleration, license scopes, and canonical project
URL.
.
.TP
.BR help , " --help" , " -h"
Print command usage and the options compiled into the program.
.
.SH PASSWORD INPUT
The password options are accepted by
.BR compress ,
.BR extract ,
.BR list ,
.BR test ,
and both
.B disk
subcommands. For
.B compress
and
.BR "disk backup" ,
the interactive form asks for confirmation.
.
.TP
.BR -p " " password , " --password " password
Read a password directly from the next process argument. This is compatible
with older command lines but can expose the password through shell history or
process inspection. Prefer one of the non-argv forms below.
.
.TP
.B --password-prompt
Read the password from the terminal without echo. This explicit form avoids
the optional-argument ambiguity of historical
.BR -p .
On POSIX, handled interruptions restore the terminal settings saved before the
prompt.
.
.TP
.BI --pass-file " file"
Read the first line from
.IR file .
The trailing LF and an optional preceding CR are removed. Empty input, an
embedded NUL, or an overlong password is rejected. Protect the file with
restrictive permissions and remove it securely when it is no longer needed.
.
.TP
.BI --pass-fd " fd"
Read the first line from the inherited numeric file descriptor
.IR fd .
ZUPT duplicates the descriptor for reading and does not close the caller's
original descriptor. The duplicate shares the underlying stream and offset;
buffered input may consume beyond the password line, so dedicate the descriptor
to this read. The same input validation as
.B --pass-file
applies.
.
.SH COMPRESSION OPTIONS
These options are accepted by
.B compress
unless stated otherwise.
.
.TP
.BR -l " " 1..9 , " --level " 1..9
Set the compression level. The default is 7. Automatic block sizes are 128 KiB
for levels 1-2, 1 MiB for levels 3-4, 2 MiB for levels 5-6, 4 MiB for level 7,
and 8 MiB for levels 8-9. Deduplication uses a smaller automatic granularity.
.
.TP
.BR -b " " bytes , " --block " bytes
Set the block size in bytes. Values are constrained to the supported range of
64 KiB through 256 MiB.
.
.TP
.BR -s , " --store"
Store data without compression.
.
.TP
.BR -f , " --fast"
Select the fast LZ codec.
.
.TP
.BR --vv , " --vaptvupt"
Force the bundled VaptVupt LZ plus ANS codec.
.
.TP
.B --lzhp
Force the portable LZHP codec.
.
.TP
.BI --kdf " algorithm"
Select the password KDF. The default source-only build supports and defaults to
.BR pbkdf2 ,
using PBKDF2-SHA256 with 600,000 iterations. A
.B WITH_SDK=1
build additionally supports
.B argon2id
and uses it by default. A build must reject a requested KDF that it cannot
provide rather than silently changing algorithms.
.
.TP
.BR -c " " text , " --comment " text
Store a comment of up to 4095 CLI bytes. In an encrypted archive the comment is
encrypted and authenticated with the archive; in a plain archive it receives
only the plain archive's non-cryptographic integrity treatment.
.
.TP
.BI --comment-file " file"
Read the comment from
.IR file .
Trailing CR/LF characters are removed.
.
.TP
.BR -D , " --dedup"
Enable block-level deduplication. Encrypted deduplicated blocks still use fresh
per-block nonces in current archives. DATA and DEDUP_REF frames are bound to
their logical positions. An authenticated reference also carries the source
position required to authenticate the referenced DATA frame.
.
.TP
.BR -S , " --solid"
Use one solid compression stream. Solid mode is single-threaded.
.
.TP
.BR -y , " --force"
Allow
.B compress
to overwrite an existing output whose name does not end in
.BR .zupt .
This does not relax extraction's no-overwrite policy.
.
.TP
.BR -t " " count , " --threads " count
Set the compression or extraction thread count. Zero selects automatic
detection; explicit values are limited to 64. This option is accepted by
.B compress
and
.BR extract ,
and by disk backup/restore, but not by
.B list
or
.BR test .
.
.TP
.BR -v , " --verbose"
Enable additional progress or diagnostic output where the selected command
implements it. Authentication failures remain intentionally generic unless
verbose diagnostics are requested, reducing the default verbal probe-oracle.
.
.SH POST-QUANTUM OPTIONS
.TP
.BI --pq " key"
Use the native hybrid envelope: ML-KEM-768 plus X25519 with the archive-key
combiner documented in
.BR THREAT_MODEL.md .
Use the recipient public key for creation and the matching private key for
reading. This is the recommended native PQ mode.
.
.TP
.BI --pq-only " key"
Use native ML-KEM-768 without the X25519 hedge. Choose it only when a policy
requires a single post-quantum KEM. Its keys are generated with
.BR "zupt keygen --pq-only" .
.
.TP
.BI --pq-sdk " key"
Use the optional system
.B libvuptsdk
integration. This option is unavailable unless ZUPT was built with
.BR WITH_SDK=1 .
It is not enabled by the default source-only distribution build.
.
.TP
.BI --pq-box " key"
Use the optional system
.B libpqvaptvupt
sealed-box integration. This option is unavailable unless ZUPT was built
with
.BR WITH_PQBOX=1 .
It is not enabled by the default source-only distribution build.
.
.SH EXTRACTION OPTIONS
.TP
.BR -o " " directory , " --output " directory
Extract below
.IR directory .
The directory is created when needed. The default is the current directory.
.
.PP
Extraction also accepts the password, PQ,
.BR -v ,
and
.B -t
options described above. Unlike compression, extract/list/test options may
appear before or after the single archive operand.
.
.SH TRUSTED LEGACY READ OPTION
.TP
.B --allow-legacy-no-ait
Permit recovery of a known, trusted historical archive that predates the
archive-integrity trailer. By default the validating read commands reject an
archive without an AIT, without trusting its unauthenticated header flags. This
option emits a downgrade warning and is accepted only by
.BR extract ,
.BR list ,
.BR test ,
and
.BR "disk restore" .
It is rejected by compression and disk backup, which always write a current
trailer.
.
.PP
Do not use this option for an archive obtained from untrusted or
attacker-writable storage. It does not authenticate the legacy header or footer.
After recovery, verify the restored data and create a new current archive.
.
.SH DISK OPTIONS
Disk options must precede the archive and device/file operands. Both disk
subcommands accept
.BR -l / --level ,
.BR -b / --block ,
.BR -s / --store ,
.BR --vv / --vaptvupt ,
.BR --lzhp ,
the password input options,
.BR --pq ,
.BR --pq-only ,
.BR -D / --dedup ,
.BR -c / --comment ,
.BR --comment-file ,
.BR --kdf ,
.BR -t / --threads ,
and
.BR -v / --verbose .
The optional SDK/PQBOX envelope options and solid mode are not disk-command
options.
.
.PP
.B --allow-legacy-no-ait
is accepted by disk restore only.
.
.SH KEY GENERATION OPTIONS
.TP
.BR -o " " file , " --output " file
Write the generated private key or exported public key to
.IR file .
This option is required.
.
.TP
.BR --pub
Export a public key from the private key selected by
.BR -k .
Use the same mode option as the private key.
.
.TP
.BR -k " " file , " --key " file
Read the source private key used by
.BR --pub .
.
.TP
.BR --pq-only , " --pqonly"
Generate or export a native ML-KEM-768-only key.
.
.TP
.BR --sdk , " --pq-sdk"
Generate an SDK-format key through the optional
.B libvuptsdk
integration.
.
.TP
.BR --box , " --pq-box"
Generate a sealed-box key through the optional
.B libpqvaptvupt
integration.
.
.PP
With no mode option,
.B keygen
generates or exports the native ML-KEM-768 plus X25519 hybrid format used by
.BR --pq .
.PP
Private-key output uses no-replace creation, POSIX mode 0600, or a Windows
current-user-only DACL. A write, flush, or close failure leaves the invalid
exclusive partial for manual removal rather than unlinking a possibly replaced
pathname. Native ZKEY and ZPQK inputs must have a valid checksum, version,
flags, reserved bytes, exact size, and public/private role; malformed or
role-confused keys are rejected.
.
.SH SECURITY NOTES
Use encrypted archives when an attacker may modify storage. Plain checksums are
not authentication. Keep private keys separate from archives, use high-entropy
passwords, and prefer
.BR --password-prompt ,
.BR --pass-file ,
or
.B --pass-fd
over argv passwords.
.PP
Archive comments remain untrusted display data even when authenticated. ZUPT
renders control bytes without emitting raw terminal-control sequences.
.
.PP
Extract untrusted archives as a dedicated unprivileged user into a new empty
local directory. POSIX builds canonicalize the user-selected output root once,
then traverse below a pinned directory descriptor with no-follow operations.
Windows builds use handle-relative traversal and
no-replace publication for normal local Win32 destinations. Extended-length and
device-namespace paths, raw UNC output roots, and mapped/network-drive output
are not supported in 5.2.2. Cross-compilation and Wine results are not native
Windows evidence; the native Windows package gate, including its Unicode round
trip, is separate and mandatory before publication.
.
.PP
Current encrypted archives protect ciphertext, canonical framing metadata,
logical frame position, and current header/footer metadata. The default AIT
requirement prevents a silent downgrade to a trailerless layout; the explicit
legacy override intentionally leaves old header/footer metadata outside that
authenticated boundary. ZUPT does not protect a compromised endpoint, a
disclosed credential, archive rollback or deletion, traffic analysis,
compression-length side channels, or every compiler and microarchitectural side
channel. Native PQ archive encryption is at-rest encryption, not session
forward secrecy.
.
.SH EXIT STATUS
.TP
.B 0
The requested operation completed successfully.
.
.TP
.B 1
Invalid arguments or an operational, format, authentication, integrity, or I/O
failure.
.
.SH FILES
.TP
.I /usr/bin/zupt
Distribution-installed command.
.
.TP
.I /usr/share/bash-completion/completions/zupt
Bash completion for the current command.
.
.TP
.I /usr/share/zsh/site-functions/_zupt
zsh completion for the current command.
.
.TP
.I /usr/share/fish/vendor_completions.d/zupt.fish
fish completion for the current command.
.
.SH EXAMPLES
Create a plain archive:
.PP
.RS
.B zupt compress backup.zupt Documents/
.RE
.
.PP
Create and restore a password-protected archive without placing the password in
argv:
.PP
.RS
.B zupt compress --password-prompt secure.zupt Documents/
.br
.B zupt test --password-prompt secure.zupt
.br
.B zupt extract --password-prompt -o restored secure.zupt
.RE
.
.PP
Use a password supplied on file descriptor 3:
.PP
.RS
.B zupt test --pass-fd 3 secure.zupt 3<password-file
.RE
.
.PP
Create a native hybrid recipient key and archive:
.PP
.RS
.B zupt keygen -o recipient.key
.br
.B zupt keygen --pub -k recipient.key -o recipient.pub
.br
.B zupt compress --pq recipient.pub backup.zupt Documents/
.br
.B zupt extract --pq recipient.key -o restored backup.zupt
.RE
.
.PP
Inspect and verify an archive without extraction:
.PP
.RS
.B zupt info backup.zupt
.br
.B zupt list backup.zupt
.br
.B zupt test backup.zupt
.RE
.
.SH COMPATIBILITY
The on-disk version byte remains v1.6, with flag-gated 5.2.2 encodings for
positional authenticated dedup references and disk-image integrity metadata.
The 5.2.2 reader retains compatibility parsers for the fixed-width disk index
and the encrypted-dedup linear AAD sequence published through 5.2.1. The narrow
compatibility fixture is an actual v5.2.1 password-encrypted DATA/DATA/REF/DATA disk
archive stored as hexadecimal text with source and hash provenance. The
candidate lists, tests, extracts, and restores that fixture byte-exact, and the exact
final candidate must repeat the gate. It does not imply that a 5.2.1 reader
accepts every new 5.2.2 archive or that every historical encrypted mode was
retested.
.
.PP
The FIPS 203 correction in VaptVupt 5.0.0 changed
native
.B --pq
and
.B --pq-only
key/archive compatibility relative to releases through 4.2.1. Password and
plain archives were not affected by that KEM correction. Consult
.B CHANGELOG.md
before relying on cross-version recovery, and test restoration before depending
on a backup.
.
.SH LICENSE
The ZUPT application and tool code are AGPL-3.0-or-later. The bundled
VaptVupt codec source is GPL-3.0-or-later. The two xxHash-derived XXH64 units
also carry BSD-2-Clause. The pq-crystals/kyber-derived portions of native
ML-KEM also carry CC0-1.0; the x86 BCJ state machine is adapted from
public-domain LZMA SDK source. Native X25519 portions adapted from
curve25519-donna also carry BSD-3-Clause. Preserve
.BR LICENSE ,
.BR LICENSE-AGPL-3.0 ,
.BR LICENSE-GPL-3.0 ,
.BR LICENSE-BSD-2-Clause ,
.BR LICENSE-BSD-3-Clause ,
.BR LICENSE-CC0-1.0 ,
.BR NOTICE ,
and
.B THIRD-PARTY-NOTICES.md
when redistributing the source.
Published historical revisions include MIT grants for exact material shipped
with those notices; the current license summary does not revoke them. See the
5.2.2 licensing erratum in
.B CHANGELOG.md
for repository evidence.
.
.SH AUTHORS
Cristian Cezar Moisés is the primary upstream author and maintainer. Packaging
credits belong in their applicable packaging history and do not imply authorship
of the upstream program.
.
.SH REPORTING BUGS
Project issues:
.UR https://github.com/cristiancmoises/zupt/issues
.UE
.
.PP
Report security vulnerabilities privately as described in
.BR SECURITY.md .
.
.SH SEE ALSO
.BR zupt-gui (1)