Skip to content
Benchmarks

Verification performance, measured honestly

Wall-clock comparisons of OSDF verification against PGP/GnuPG and OpenTDF, produced by a reproducible Hyperfine harness. We publish exactly what each bar measures, what it does not, and the commands to reproduce every number yourself.

Headline comparison

Wall-clock verify latency

Mean time per invocation across warmed-up Hyperfine runs. Each bar is a different tool doing a different job - read the methodology before comparing them.

Verification wall-clock latency by command (milliseconds, lower is better). Baseline is OSDF full verify; the OpenTDF decrypt bar measures a different operation and is not directly comparable.
ToolCommandMean (ms)Std dev (ms)Min (ms)Max (ms)Runs
OSDFOSDF full verify8.10.67.29.410
PGP / GnuPGGPG detached verify3.20.32.83.910
OpenTDFOpenTDF structural read1.60.21.32.110
OpenTDFOpenTDF decrypt (online)124.011.0108.0146.010

Lower is better. Bars share a single linear scale; sub-millisecond bars are clamped to a minimum width so they remain visible.

Methodology

How the numbers are produced

The harness uses Hyperfine for warmed-up, statistically-summarized wall-clock timing. Every comparator bar is added only when its tooling and fixtures are present, each with a clear label, so a single export describes exactly which tools ran.

Warmups

5 warmup runs discarded before timing begins, to stabilize OS caches.

Timed runs

At least 10 timed runs per command; mean, standard deviation, and min/max are reported.

Fixtures

A committed valid OSDF package, a locally-signed GPG payload, and an official OpenTDF golden .tdf vector.

What each benchmark bar measures and does not measure
BarTypical operationWhat is measuredWhat is not
OSDF full verifyosdf verify package.osdfContainer open + manifest parse + hash of every declared object + revision chain + optional transparency-log inclusion.PDF rendering, policy decrypt.
GPG detached verifygpg --batch --verify file.sig fileEd25519 signature check over a single payload file.Manifest object model, transparency log, revision chain.
OpenTDF structural read (offline)open the golden .tdf ZIP + JSON-parse 0.manifest.jsonContainer open + manifest parse - the offline analogue of OSDF's structural read.KAS round-trip, key unwrap, payload decrypt, policy gate.
OpenTDF decrypt (optional, online)otdfctl decrypt --host $OTDF_PLATFORM …Attribute + policy gate + key unwrap + payload decrypt against a live platform.Declarative audit of every declared object (different design center).

The crucial caveat: OpenTDF and OSDF measure different operations. The default OpenTDF bar is a structural manifest read (open a ZIP, parse one JSON file) - it is not a decrypt. A true decrypt requires a running OpenTDF platform and otdfctl, and is opt-in. OSDF, by contrast, is an integrity/audit format and does not encrypt payloads at all. Treat any single cross-tool number as a shape, not a verdict.

Caveats

Read this before you quote a number

Radical transparency is the point. These caveats are not fine print - they define what the numbers mean.

C-01

These are trust-model comparisons, not byte-for-byte equivalence. Each tool is doing a different amount of work.

C-02

OSDF full verify does strictly more than a GPG detached verify or an OpenTDF structural read - it hashes every declared object and checks the revision chain.

C-03

The OpenTDF decrypt bar measures a live KAS round-trip and payload decrypt. OSDF has no equivalent because it is an integrity/audit format, not an encryption gate. Never compare that bar to an OSDF bar as if equal.

C-04

Numbers are machine-specific and dominated by process startup at these sizes. Regenerate on your own hardware before drawing conclusions.

C-05

A lower number is not automatically 'better' when the operations differ - read what each bar measures first.

What this does NOT prove

  • That OSDF is 'faster than PGP' or 'faster than OpenTDF' in general - only that these specific operations, on this fixture, took this long.
  • Throughput at scale, under concurrency, or on large manifests - see the Criterion and scale_bench harnesses in the repo for that.
  • Anything about security strength. Speed is not a security property; see the Security pages for guarantees.
  • That the structural-read and decrypt operations are interchangeable. They are not.
Reproducibility

Run it yourself

The harness auto-detects comparators: a machine with only Hyperfine and the OSDF CLI still works - every other bar is skipped with a printed message, never a hard failure.

macOS / Linux

# from the osdf repo root
./scripts/run-benchmarks.sh

Windows (PowerShell)

# from the osdf repo root
.\scripts\run-benchmarks.ps1

Optional: add the true OpenTDF decrypt bar

export OTDF_PLATFORM="https://localhost:8080"
# optional auth flags forwarded verbatim to otdfctl decrypt:
export OTDF_DECRYPT_ARGS="--tls-no-verify --with-client-creds-file creds.json"
./scripts/run-benchmarks.sh

Then refresh this page's data

The run writes docs/assets/benchmarks/hyperfine-results.json in the osdf repo. Import it into this site:

# from the osdf-web repo root
npm run benchmarks:import

That normalizes the Hyperfine export into src/lib/content/benchmarks/results.json and flips this page from illustrative to verified on the next build.

Environment

Measurement context

Placeholder context - real values are captured automatically on import.

CPU

Representative x86-64 workstation (placeholder)

OS

Placeholder OS - replace with real run

Memory

Dual-channel DDR5 (placeholder)

osdf0.x (placeholder)hyperfine1.x (placeholder)gpg2.x (placeholder)otdfctln/a (placeholder)

Source: illustrative.ts - placeholder dataset, not a measured run

Verify, don't trust

Run the checks yourself

The OSDF Verification CLI produces deterministic results for CI and audit. Pair it with the open benchmark harness to measure trust on your own hardware.