License audit: SPDX headers + per-file provenance (closes 7cbbf97)

Add SPDX-License-Identifier to every source file in lib/ and cli/.
Files derived from Bobrowski's libunuc2 retain LGPL-3.0-only;
cli/src/main.c (derived from his GPL-licensed unuc2 tool) and all
new Phase 2-7 work by Valetov are GPL-3.0-or-later.  No silent
LGPL-to-GPL upgrade has been applied.

CREDITS.md now lists each Bobrowski-derived file specifically rather
than crediting libunuc2 as generic 'inspiration'.

docs/license-audit.md records the full per-file provenance table,
the LGPL-3.0 -> GPL-3.0 chain rationale (LGPL sec. 4 Combined Works
is the operative clause; LGPL sec. 3 single-direction upgrade is
documented but not exercised), and confirms that:
- the 2015 LGPL-3.0 release in original/UC2_source/ is preserved
  unchanged;
- the 2020-2021 LGPL/GPL releases in original/unuc2-0.6/ are preserved
  unchanged;
- lib/src/super.bin is bit-identical to upstream and to de Vries's
  1992 distribution data.
This commit is contained in:
Eremey Valetov
2026-05-03 12:20:19 -04:00
parent 5c01fec996
commit 3dcfb3c4c4
41 changed files with 258 additions and 2 deletions
+24 -2
View File
@@ -18,7 +18,23 @@ versioning. The original source code is preserved in `original/UC2_source/`.
**Jan Bobrowski** wrote a clean-room portable decompressor (2020--2021) that
forms the foundation of this project's decompression engine. The library
(`libunuc2`) is licensed under LGPL-3.0; the CLI tool (`unuc2`) is licensed
under GPL-3.0.
under GPL-3.0-or-later.
The following files in this repository derive directly from Bobrowski's
work and retain his licence (see `docs/license-audit.md` for the full
provenance table):
- `lib/src/decompress.c` (LGPL-3.0-only) -- derived from `libunuc2.c`
- `lib/src/list.h` (LGPL-3.0-only) -- byte-identical to upstream
- `lib/include/uc2/libuc2.h` (LGPL-3.0-only) -- derived from `libunuc2.h`
- `cli/src/main.c` (GPL-3.0-or-later) -- derived from `unuc2.c`,
with substantial additions for archive creation, OTS, and benchmarking
- `cli/src/compat/compat_win32.c` (LGPL-3.0-only)
- `cli/src/compat/compat_dos.c` (LGPL-3.0-only, DOS adaptation by Valetov)
The SuperMaster dictionary (`lib/src/super.bin`) is bit-identical to the
copy shipped in `original/unuc2-0.6/` and to the data extracted from
de Vries's 1992 binaries.
- Website: <http://torinak.com/~jb/unuc2/>
- Original source preserved in `original/unuc2-0.6/`
@@ -44,8 +60,14 @@ under GPL-3.0.
- Content-aware preprocessing (BCJ, BWT, delta filter)
- LZ4 ultra-fast compression
- BLAKE3 cryptographic hashing
- SHA-256 (FIPS 180-4) implementation
- OpenTimestamps integration (proof parser, walker, archive trailer)
- Dictionary metadata for cross-archive sharing
- Backward compatibility with original UC2 Pro (verified via DOSBox-X)
- Automated test infrastructure (16 unit tests, DOSBox-X cross-tool testing)
- Automated test infrastructure (19 unit tests, DOSBox-X cross-tool testing)
All files under "UC2 v3.0.0 Revival" are licensed GPL-3.0-or-later by
Eremey Valetov (2026). See `docs/license-audit.md` for the per-file
provenance table and the LGPL-3.0 / GPL-3.0 chain rationale.
- GitHub: <https://github.com/evvaletov/uc2>
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: LGPL-3.0-only */
/* DOS/DJGPP compatibility layer for UC2.
Provides BSD err.h functions and fnmatch for DJGPP,
which lacks these POSIX/BSD extensions.
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: LGPL-3.0-only */
/* Win32 compatibility layer for UC2 CLI.
Provides POSIX/BSD functions missing from MSVC and MinGW.
All file operations use wide-char Windows APIs for UTF-8 support.
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Minimal POSIX getopt() for MSVC.
Supports short options with optional arguments (e.g., "d:"). */
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
#ifndef _ERR_H
#define _ERR_H
#ifdef __GNUC__
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
#ifndef _FNMATCH_H
#define _FNMATCH_H
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Minimal POSIX getopt for MSVC */
#ifndef _COMPAT_GETOPT_H
#define _COMPAT_GETOPT_H
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Minimal POSIX unistd.h for MSVC */
#ifndef _COMPAT_UNISTD_H
#define _COMPAT_UNISTD_H
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* POSIX utime.h for MSVC (which only provides sys/utime.h) */
#ifndef _COMPAT_UTIME_H
#define _COMPAT_UTIME_H
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* UltraCompressor II extraction tool.
Copyright © Jan Bobrowski 2020, 2021
torinak.com/~jb/unuc2/
+156
View File
@@ -0,0 +1,156 @@
# UC2 License Audit
Status: 2026-05-03. Maintained by Eremey Valetov.
UC2 v3 builds on three layers of prior work, each released under its
own free-software licence. This document records per-file provenance,
the LGPL-3.0 -> GPL-3.0 transition rationale, and the SPDX identifiers
applied across the source tree.
## Layer 1: Nico de Vries (1992-1996), released 2015
Nico de Vries authored UltraCompressor II as proprietary DOS software
between 1992 and 1996. Danny Bezemer obtained permission to release
the source code publicly and did so in 2015 under the GNU Lesser
General Public License v3 (LGPL-3.0).
The 2015 release is preserved in this repository under
`original/UC2_source/` byte-for-byte unchanged, including its license
header (`GNU LESSER GENERAL PUBLIC LICENSE V3.txt`) and the original
binaries (`uc2pro.exe`, `uc237b.exe`, `ue.exe`). No file in `lib/` or
`cli/` is a verbatim copy of any file in that release. The 2015 source
serves as the format specification: it is read for documentation
purposes (the on-disk archive layout, the SuperMaster dictionary
contents, the Huffman tree encoding) but its C code is not linked in.
Relicensing impact: none. Layer 1 is preserved under its original
LGPL-3.0 licence; nothing is moved upward to GPL-3.0.
## Layer 2: Jan Bobrowski (2020-2021), libunuc2 / unuc2
Jan Bobrowski wrote a clean-room portable decompressor for UC2 v3
archives between 2020 and 2021. He released two products:
- `libunuc2` (decompression library) under LGPL-3.0
- `unuc2` (CLI tool) under GPL-3.0-or-later
The upstream source is preserved in `original/unuc2-0.6/`. The
following files in this repository derive from Bobrowski's work and
retain his original licence:
| Current file | Upstream origin | Licence |
|---------------------------------------|------------------------------------------|---------------|
| `lib/src/decompress.c` | `original/unuc2-0.6/libunuc2.c` | LGPL-3.0-only |
| `lib/src/list.h` | `original/unuc2-0.6/list.h` (identical) | LGPL-3.0-only |
| `lib/src/super.bin` | `original/unuc2-0.6/super.bin` (identical) | data (de Vries) |
| `lib/include/uc2/libuc2.h` | `original/unuc2-0.6/libunuc2.h` | LGPL-3.0-only |
| `cli/src/main.c` | `original/unuc2-0.6/unuc2.c` | GPL-3.0-or-later |
| `cli/src/compat/compat_win32.c` | `original/unuc2-0.6/compat/compat.c` (Win32 portions) | LGPL-3.0-only |
| `cli/src/compat/compat_dos.c` | derived from `compat/compat.c` (DOS adaptation by Valetov) | LGPL-3.0-only |
Modifications by Valetov in 2026 are released under the same licence
as the file's upstream origin (LGPL-3.0 stays LGPL-3.0; GPL-3.0 stays
GPL-3.0). No unilateral upgrade from LGPL to GPL has been applied to
Bobrowski's work.
`lib/src/super.bin` is the SuperMaster dictionary block from the 1992
distribution. It is data, not code: a fixed binary table used as a
compression-context priming dictionary. It is bit-identical to the
file in Bobrowski's release and to the data extracted from de Vries's
1992 binaries.
## Layer 3: Eremey Valetov (2026), UC2 v3 revival
The following files are new work by Valetov, originally authored for
the UC2 v3 revival project, released under GPL-3.0-or-later:
| File | Function |
|---------------------------------------|----------------------------------------------------|
| `lib/src/compress.c` | LZ77+Huffman compressor (inverse of decompress.c) |
| `lib/src/uc2_tables.c` | Huffman delta-coding lookup tables |
| `lib/src/uc2_internal.h` | Shared compressor/decompressor types and constants |
| `lib/src/uc2_cdc.c` + `.h` | Content-defined chunking (Gear hash) |
| `lib/src/uc2_merkle.c` + `.h` | Merkle DAG of deduplicated blocks |
| `lib/src/uc2_blockstore.c` + `.h` | Cross-archive content-addressable block store |
| `lib/src/uc2_simhash.c` + `.h` | SimHash near-duplicate detection |
| `lib/src/uc2_delta.c` + `.h` | Binary delta compression |
| `lib/src/uc2_rans.c` + `.h` | rANS entropy coder (method 10) |
| `lib/src/uc2_dict.c` + `.h` | Dictionary metadata for cross-archive sharing |
| `lib/src/uc2_preprocess.c` + `.h` | BCJ / BWT / delta-filter preprocessing |
| `lib/src/uc2_lz4.c` + `.h` | LZ4 ultra-fast compression |
| `lib/src/uc2_blake3.c` + `.h` | BLAKE3 cryptographic hashing |
| `lib/src/uc2_sha256.c` + `.h` | SHA-256 (FIPS 180-4) |
| `lib/src/uc2_ots.c` + `.h` | OpenTimestamps proof parser, walker, trailer |
| `cli/src/compat/getopt.c` | Minimal POSIX getopt for MSVC |
| `cli/src/main.c` (post-`9525a81` additions) | OTS attach/extract/info, archive creation, scanning, benchmark | GPL-3.0-or-later (matches upstream `unuc2.c`) |
The Phase 3-7 modules are independent implementations. They reference
the UC2 v3 archive format (which is a bitstream layout, not a
copyrighted work) and use BLAKE3, SHA-256, LZ4, rANS, etc. from
public-domain or self-authored reference implementations. None of
these modules link to or derive from Bobrowski's code beyond using
shared header types declared in `uc2_internal.h`.
## Relicensing rationale
The composite project links Bobrowski's LGPL-3.0 library (`lib/`) into
a GPL-3.0-or-later executable (`cli/`). This combination is permitted
by LGPL-3.0 sec. 4 (Combined Works): the LGPL library may be used in
GPL-licensed work without requiring the library itself to be relicensed.
No code has been moved from LGPL-3.0 to GPL-3.0 in this project.
LGPL §3 permits a one-way upgrade from LGPL to GPL but exercising it
is unnecessary here: the LGPL files remain LGPL, the GPL files remain
GPL, and the combined work is distributable under GPL-3.0-or-later (as
recorded in the project root `LICENSE` file).
If a downstream user wishes to redistribute `lib/` standalone under
LGPL-3.0, the LGPL-3.0 files are individually identifiable via their
SPDX-License-Identifier headers.
## SPDX policy
All source files in `lib/` and `cli/` carry one of two SPDX
identifiers near the top:
- `SPDX-License-Identifier: LGPL-3.0-only` for files derived from
Bobrowski's libunuc2 / compat code.
- `SPDX-License-Identifier: GPL-3.0-or-later` for `cli/src/main.c`
(matches Bobrowski's original GPL-3.0-or-later choice for the CLI
tool) and for all Valetov-authored Phase 2 through Phase 7 work.
Original copyright lines authored by Bobrowski are preserved verbatim
where present. Where Valetov has added substantial new content to a
Bobrowski-originated file (notably `cli/src/main.c` and
`compat_dos.c`), an additional Valetov copyright line has been added
without removing the original.
The 2015 LGPL-3.0 release in `original/UC2_source/` and the 2020-2021
release in `original/unuc2-0.6/` are preserved unchanged and are not
subject to this policy: they retain whatever licence headers their
authors shipped them with.
## Audit checklist
- [x] LGPL-3.0 release by Bezemer/de Vries preserved unchanged in
`original/UC2_source/`
- [x] LGPL-3.0 / GPL-3.0 release by Bobrowski preserved unchanged in
`original/unuc2-0.6/`
- [x] Per-file provenance table above
- [x] SPDX-License-Identifier on every source file in `lib/` and `cli/`
- [x] CREDITS.md attributes Bobrowski specifically for libunuc2-derived
files, not as generic "inspiration"
- [x] LICENSE-HISTORY summary published as this file
(`docs/license-audit.md`)
- [x] No silent LGPL-to-GPL upgrade: every Bobrowski-origin file
retains LGPL-3.0-only
## References
- LGPL-3.0 text: <https://www.gnu.org/licenses/lgpl-3.0.html>
- GPL-3.0 text: see `LICENSE` in repository root
- Bobrowski upstream: <http://torinak.com/~jb/unuc2/>
- Bezemer 2015 release notes: `original/UC2_source/Read Me First.txt`
- LGPL-3.0 sec. 3 (allowing one-way upgrade to GPL):
<https://www.gnu.org/licenses/lgpl-3.0.html#section3>
- LGPL-3.0 sec. 4 (Combined Works): same document, sec. 4
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: LGPL-3.0-only */
#ifndef LIBUC2_H
#define LIBUC2_H
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* BLAKE3 cryptographic hashing for archive integrity.
*
* BLAKE3 is a fast cryptographic hash based on the Bao tree hashing
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Cross-archive block store for content-addressable deduplication.
*
* Stores unique CDC chunks indexed by 64-bit content hash. Multiple
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Content-defined chunking (CDC) for UC2 deduplication.
*
* Uses the Gear rolling hash for fast, content-aware chunk boundary
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Delta compression for file versioning.
*
* Computes a compact binary delta between a source (old) and target
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Dictionary management for zstd-inspired dictionary compression.
*
* Formalizes UC2's master blocks as proper dictionaries with content
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* LZ4-compatible ultra-fast compression.
*
* Minimal LZ4-like compressor optimized for speed over ratio.
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Merkle DAG for content-addressable deduplication.
*
* Builds a Merkle tree from CDC chunks: each file is represented as a
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* OpenTimestamps integration.
*
* UC2 stores an OpenTimestamps proof in a magic-bracketed sidecar
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Content-aware preprocessing filters for improved compression.
*
* These transforms are applied BEFORE compression to expose redundancy
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* rANS (range Asymmetric Numeral Systems) entropy coder.
*
* Drop-in replacement for Huffman coding with ~5-15% better compression
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* SHA-256 (FIPS 180-4) -- pure C implementation.
*
* Used by the OpenTimestamps integration; calendars accept SHA-256
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Near-duplicate detection via SimHash.
*
* SimHash produces a fixed-size fingerprint where similar documents
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* UC2 LZ77+Huffman compressor.
Produces bitstreams compatible with Bobrowski's decompressor (decompress.c).
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: LGPL-3.0-only */
/* UltraCompressor II decompression library.
Copyright © Jan Bobrowski 2020, 2021
torinak.com/~jb/unuc2/
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: LGPL-3.0-only */
/* list.h by Jan Bobrowski. Inspired by list.h from Linux */
#ifndef LIST_H
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* BLAKE3 cryptographic hashing — simplified single-threaded implementation.
*
* Based on the BLAKE3 specification (github.com/BLAKE3-team/BLAKE3).
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Cross-archive block store for content-addressable deduplication.
*
* Chunks are stored as individual files named by their 64-bit hash
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Content-defined chunking (CDC) for UC2 deduplication.
*
* Gear hash: each byte updates the hash by shifting left and XORing
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Delta compression for file versioning.
*
* Uses a hash-based matching approach: hash all 4-byte windows in the
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Dictionary management for zstd-inspired dictionary compression. */
#include "uc2/uc2_dict.h"
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* UC2 format constants and shared types.
Used by both the compressor and decompressor. */
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* LZ4-compatible ultra-fast compression.
*
* Single-probe hash table with 4-byte match minimum. No hash chains
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Merkle DAG for content-addressable deduplication.
*
* Each file is split into CDC chunks (Gear hash), each chunk hashed
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* OpenTimestamps proof parser, serializer, walker, and UC2 trailer.
*
* The walker supports the calendar-path subset of opcodes (APPEND,
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Content-aware preprocessing filters. */
#include "uc2/uc2_preprocess.h"
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* rANS (range Asymmetric Numeral Systems) entropy coder.
*
* Table-based rANS with 32-bit state. The state represents a position
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* SHA-256 (FIPS 180-4). Reference textbook implementation. */
#include "uc2/uc2_sha256.h"
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Near-duplicate detection via SimHash.
*
* Algorithm: extract overlapping 4-byte shingles from the input,
+2
View File
@@ -1,3 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* UC2 shared tables: Huffman delta coding and default tree lengths. */
#include "uc2_internal.h"