release: restore ZUPT and harden source-only 5.2.2
This commit is contained in:
parent
74e393ba3e
commit
ff99770bd0
205 changed files with 19627 additions and 13215 deletions
|
|
@ -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
|
||||
730
doc/vaptvupt.1
730
doc/vaptvupt.1
|
|
@ -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.
|
||||
234
doc/zupt-gui.1
234
doc/zupt-gui.1
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
vaptvupt.1
|
||||
634
doc/zupt.1
Normal file
634
doc/zupt.1
Normal 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)
|
||||
Loading…
Reference in a new issue