English · 한국어
License notes (third-party & project licensing)¶
What this document is: an accounting of every license pqcota uses internally as of today, organized by how it is consumed. The consumption form matters because license obligations change completely depending on whether something is linked into a distributed binary.
This is the licensing axis: what each dependency is licensed under, and how it is consumed.
§ notation: a
§Nin this document is a section number of this document.⚠️ Disclaimer: this document is not legal advice. Before distribution, due diligence by counsel specializing in OSS licensing (GPL vs AGPL, or-later, the exact per-version conditions) is required.
0. The conclusion in one line¶
Every third party linked or bundled into a pqcota product binary is permissively licensed (Apache-2.0 / MIT / BSD-3). Copyleft (GPL and friends) exists only in tools that run as separate processes (Ansible, the JDK in the demo environment); none of it is linked into or bundled with a pqcota binary (§5). What that means under each tool's license is a separate review, not something this document settles.
1. pqcota's own licensing¶
This repo (pqcota) is Apache-2.0. Every third party linked or bundled into the distributed outputs (Go binaries, the Java sidecar) is permissively licensed (the §2 table).
pqcota-cbom-ingest does not run CBOMkit or other GPL-family generators; it only reads the CycloneDX files they produce (delegated CBOM intake design). What that means under those tools' licenses is a separate review (below).
2. Runtime dependencies linked into the build output (Go)¶
Dependencies compiled and linked into the static Go binaries built from this repo (collectors, CLIs). All permissive.
| Module | Version | License | Note |
|---|---|---|---|
github.com/jackc/pgx/v5 |
v5.10.0 | MIT | Postgres driver (persistence) |
github.com/jackc/pgpassfile |
v1.0.0 | MIT | pgx indirect |
github.com/jackc/pgservicefile |
v0.0.0-20240606120523-5a60cdf6a761 | MIT | pgx indirect |
github.com/jackc/puddle/v2 |
v2.2.2 | MIT | pgx connection pool |
google.golang.org/grpc |
v1.83.2 | Apache-2.0 | intake contract transport |
google.golang.org/protobuf |
v1.36.11 | BSD-3-Clause | contract serialization (protojson included) |
google.golang.org/genproto/googleapis/rpc |
v0.0.0-20260526163538-3dc84a4a5aaa | Apache-2.0 | grpc indirect |
golang.org/x/sys |
v0.49.0 | BSD-3-Clause | AF_PACKET (network collector) |
golang.org/x/net |
v0.62.0 | BSD-3-Clause | grpc indirect |
golang.org/x/sync |
v0.24.0 | BSD-3-Clause | indirect |
golang.org/x/text |
v0.43.0 | BSD-3-Clause | indirect |
gopkg.in/yaml.v3 (MIT) is not in the list above — it is used only by the demo topology generator and by tests, so it is not linked into the collectors or CLIs.
Summary: no copyleft is linked. Apache-2.0, MIT and BSD-3 are generally treated as compatible with an Apache-2.0 distribution, provided their notices are kept (below).
(A distribution has to keep the notices and conditions each license requires: for MIT, its copyright and permission notice; for BSD-3-Clause, its copyright notice, conditions and disclaimer, and it limits using contributors' names to endorse a product. This repo collects them in THIRD-PARTY-NOTICES; that file name is not itself a requirement.)
3. Build-time tools (not linked into the output)¶
Used only for code generation and compilation; not linked into the resulting binaries.
| Tool | License | Purpose |
|---|---|---|
Go toolchain (golang:1.26) |
BSD-3-Clause (Go) | compilation |
buf (bufbuild/buf) |
Apache-2.0 | proto code generation (buf generate) |
protoc-gen-go |
BSD-3-Clause | Go message generation |
protoc-gen-go-grpc |
Apache-2.0 | gRPC stub generation |
4. Demo environment components (demo/) — separate processes/containers, not linked¶
The components below run in the discovery demo (
demo/) over SSH, as subprocesses, or in containers, and are not linked into any pqcota binary.
demo/ operates through containers and separate executables. Nothing there is statically or dynamically linked into a pqcota binary; it all runs beyond an SSH, subprocess, or container process boundary → GPL/copyleft tools there stay separate programs; what their licenses require is reviewed separately (§5).
| Component | Version | License | Consumption form |
|---|---|---|---|
BouncyCastle bcprov-jdk18on |
1.85 | Bouncy Castle Licence (MIT X11 family, permissive) | pay-app's JCA provider (a separate JVM). Permissive; bundling it would mean keeping its notice |
| Eclipse Temurin (OpenJDK) | 21 | GPLv2 + Classpath Exception | pay-app's runtime (separate container and process). GPLv2 with the Classpath Exception applies; how far the exception covers a given use is reviewed separately |
| OpenSSL | 3.x (Ubuntu) | Apache-2.0 | TLS for web-gw/pay-db (separate processes) |
| OpenSSH (server/client) | 9.x | BSD family (+ some public domain) | sshd and ssh (Ansible transport, and the subject of SSH edge observation) |
| Ansible | (distro) | GPL-3.0-or-later | a standalone executable run on the controller. Not linked with pqcota (an orchestration tool) |
Graphviz (dot) |
(distro) | CPL-1.0 (Common Public License) | topology SVG rendering (separate process). The output (SVG) is data |
| Ubuntu 24.04 base image | — | an aggregate (many packages, mostly GPL/LGPL/MIT/BSD) | container base |
golang:1.26 base image |
— | an aggregate (Go = BSD-3 + a Debian base) | builder stage |
How the GPL tools (Ansible, Temurin) are treated: these are separate programs pqcota invokes, not link targets. Ansible is the orchestrator that runs playbooks; Temurin is just the runtime on the target node. Whether a use of them creates obligations under the GPL depends on more than how the programs communicate, so that is left to a separate review. With the build procedure provided today, the user downloads these tools when building the image; pqcota does not ship them. If a built container image is distributed, the redistribution terms of what it contains are checked separately.
5. Keeping GPL code separate — what enforces it¶
GPL code is kept apart from pqcota's code and distributions by structure. Three principles (technical measures, not a legal conclusion):
- Process separation — a GPL component is invoked as an independent binary, never linked as a library.
- A standard data boundary — inter-process exchange happens only through CycloneDX CBOM (a standard). Core internal APIs never cross it.
- Distribution separation — GPL code is never bundled, statically linked, or vendored into this repo or its distributions.
The same boundary applies even if we write our own GPL collector. The exact license per component (GPL vs AGPL, or-later) and the AGPL implications for a SaaS deployment require due diligence — this document is not legal advice.
What enforces those principles is the table below.
| Principle | What enforces it |
|---|---|
| Separate process | the intake contract in contracts/.../collector.proto — a GPL collector, if one is added, would stand behind gRPC/CLI |
| Standard data only | that contract carries nothing but CycloneDX + Envelope. Core internal types never cross it |
| Distribution separation | GPL code, if ever used, goes in a separate repo and not in go.mod (no such repo exists today). No automated license scan runs in CI today, so this is kept by review |
Ansible (GPL-3) and Temurin (GPLv2+CE) in demo/ likewise run as separate processes outside the same boundary.
This repo is published under Apache-2.0. The point is to open up observability so the community can add collectors, and the reference collectors are OSS for the same reason (including the JVM introspection, which nothing off the shelf covers).
| Category | License | What it contains |
|---|---|---|
| This repo | Apache-2.0 | contracts, normalization, inventory, provisioning generation + reference collectors |
| PQC provider libraries | varies per asset | BouncyCastle (permissive) · BC-FJA (FIPS, separate agreement) — procured by the user |
Where the license is stated. Each collector states its license in CollectorCapabilities.license (and Envelope.collector_license), so a caller can show whether a backend means "a GPL component installed separately" or "the reference = Apache-2.0, included".
Appendix: consumption forms at a glance¶
| Consumption form | Copyleft present? | How it is kept separate | Examples |
|---|---|---|---|
| Linked into the build output (§2) | ❌ none | not applicable | pgx (MIT), grpc (Apache), protobuf (BSD) |
| Build time (§3) | ❌ none | not applicable | buf, protoc-gen-* |
| Separate processes in the demo (§4) | ✅ yes (Ansible, Temurin) | separate processes (license terms reviewed separately) | Ansible (GPL-3), Temurin (GPLv2+CE) |