Offline License: Air-Gapped Validation
In this tutorial, you'll issue a QuantumLock license and validate it in a completely air-gapped environment β no network access required. This is essential for sovereign computing, defense, and high-security deployments.
Objectiveβ
By the end of this tutorial, you will have:
- β Generated an offline-capable license file
- β Transferred it to an air-gapped machine
- β Validated the license without network access
- β Verified feature entitlements locally
Prerequisitesβ
On the Online Machine (License Authority)β
# QuantumLock CLI
pip install quantumlock
quantumlock --version
# Should show: quantumlock v2.x.x
# Authenticated with license authority
quantumlock auth status
On the Air-Gapped Machineβ
# QuantumLock SDK (offline mode)
# Pre-installed via approved package transfer
pip install quantumlock --no-index --find-links ./packages/
Architecture Overviewβ
βββββββββββββββββββββββ βββββββββββββββββββββββ
β ONLINE MACHINE β β AIR-GAPPED MACHINE β
β (License Issuer) β β (License Consumer) β
βββββββββββββββββββββββ€ βββββββββββββββββββββββ€
β β β β
β 1. Generate key β βββUSB/SecureββββΆ β 2. Import key β
β 2. Issue license β Transfer β 3. Validate β
β 3. Export bundle β β 4. Use features β
β β β β
βββββββββββββββββββββββ βββββββββββββββββββββββ
Step 1: Generate Machine Fingerprint (Air-Gapped)β
On the air-gapped machine, generate a hardware fingerprint:
quantumlock fingerprint generate --output machine-fingerprint.json
Output:
π Generating machine fingerprint...
Machine ID: m_8a7b6c5d-4e3f-2a1b-0c9d-8e7f6a5b4c3d
CPU: AMD EPYC 7763
Platform: Linux 6.1.0
Hostname: secure-hpc-node-01
β
Saved to: machine-fingerprint.json
Transfer this file to the license authority for binding.
Transfer machine-fingerprint.json to the online machine (USB, secure channel, etc.).
Step 2: Issue License (Online Machine)β
On the online machine, issue a license bound to the fingerprint:
quantumlock license issue \
--customer "Acme Defense Corp" \
--product "QCOS Enterprise" \
--features "acos,evidence,unlimited-jobs" \
--expires "2027-01-04" \
--fingerprint ./machine-fingerprint.json \
--offline \
--output license-bundle.zip
Output:
π Issuing offline license...
Customer: Acme Defense Corp
Product: QCOS Enterprise
Features: acos, evidence, unlimited-jobs
Expires: 2027-01-04
Bound to: m_8a7b6c5d-4e3f-2a1b-0c9d-8e7f6a5b4c3d
Offline: YES β
π¦ License bundle created:
βββ license.qlicense (signed license file)
βββ public-key.pem (ML-DSA-65 verification key)
βββ validation-instructions.md
β
Saved to: license-bundle.zip
Transfer this bundle to the air-gapped machine.
Step 3: Transfer to Air-Gapped Machineβ
Transfer license-bundle.zip via approved secure channel (USB, optical media, etc.).
On the air-gapped machine:
unzip license-bundle.zip -d ./license/
ls -la ./license/
total 24
-rw-r--r-- 1 user user 4096 Jan 4 16:00 license.qlicense
-rw-r--r-- 1 user user 2048 Jan 4 16:00 public-key.pem
-rw-r--r-- 1 user user 1024 Jan 4 16:00 validation-instructions.md
Step 4: Import License (Air-Gapped)β
Import the license and verification key:
quantumlock license import \
--license ./license/license.qlicense \
--public-key ./license/public-key.pem
Output:
π₯ Importing license...
License ID: lic_3c4d5e6f-7a8b-9c0d-1e2f-3a4b5c6d7e8f
Customer: Acme Defense Corp
Product: QCOS Enterprise
Expires: 2027-01-04
π Signature verification (ML-DSA-65)...
Signature: VALID β
π₯οΈ Machine binding verification...
Expected: m_8a7b6c5d-4e3f-2a1b-0c9d-8e7f6a5b4c3d
Current: m_8a7b6c5d-4e3f-2a1b-0c9d-8e7f6a5b4c3d
Binding: VALID β
β
License imported successfully!
Stored at: ~/.quantumlock/licenses/lic_3c4d5e6f...
Step 5: Validate License (Air-Gapped)β
Validate without any network access:
quantumlock license validate --offline
Output:
π Validating license (offline mode)...
[1/4] License File Integrity
βββ Hash: sha3-256:7a8b9c0d1e2f...
βββ Status: VALID β
[2/4] Signature Verification (ML-DSA-65)
βββ Algorithm: Dilithium Level 3
βββ Quantum-Safe: YES
βββ Status: VALID β
[3/4] Machine Binding
βββ Fingerprint match: YES
βββ Status: VALID β
[4/4] Expiration Check
βββ Current: 2026-01-04
βββ Expires: 2027-01-04
βββ Days remaining: 365
βββ Status: VALID β
ββββββββββββββββββββββββββββββββββββββββββββββββ
β
LICENSE VALID (OFFLINE)
Customer: Acme Defense Corp
Product: QCOS Enterprise
Features: acos, evidence, unlimited-jobs
No network access required for validation.
ββββββββββββββββββββββββββββββββββββββββββββββββ
Step 6: Check Feature Entitlementsβ
Query specific features:
quantumlock features check acos
β
Feature 'acos' is ENABLED
Entitled: YES
Expires: 2027-01-04
quantumlock features list
Feature Status Expires
βββββββββββββββββββββββββββββββββββββ
acos β
ON 2027-01-04
evidence β
ON 2027-01-04
unlimited-jobs β
ON 2027-01-04
synapsex β OFF β
Step 7: SDK Integrationβ
Use the license in your Python application:
from quantumlock import QuantumLock
# Initialize in offline mode
ql = QuantumLock(offline=True)
# Validate license
result = ql.validate()
print(f"License valid: {result.valid}")
print(f"Customer: {result.customer}")
print(f"Expires: {result.expires}")
# Check feature
if ql.has_feature("acos"):
print("ACOS features available!")
# ... use ACOS functionality
else:
print("ACOS not licensed")
Output:
License valid: True
Customer: Acme Defense Corp
Expires: 2027-01-04
ACOS features available!
Verification Checklistβ
| Check | Command | Expected |
|---|---|---|
| License imported | quantumlock license list | Shows license ID |
| Signature valid | quantumlock license validate | Signature: VALID |
| Machine bound | quantumlock license validate | Binding: VALID |
| Features work | quantumlock features check acos | Status: ON |
Troubleshootingβ
"Machine fingerprint mismatch"β
The license was issued for a different machine. Re-generate fingerprint on the correct machine and re-issue.
# On air-gapped machine
quantumlock fingerprint show
# Compare with license expectation
quantumlock license info --show-binding
"License expired"β
Issue a new license with extended expiration:
quantumlock license renew --license-id lic_3c4d5e6f... --extend-years 1
"Public key not found"β
Ensure the public key was imported:
quantumlock keys import ./license/public-key.pem
Security Considerationsβ
Why ML-DSA (Dilithium)?β
QuantumLock uses ML-DSA-65 (NIST-standardized Dilithium) because:
- Resistant to quantum computer attacks
- Suitable for long-term license validity (5+ years)
- NIST FIPS 204 compliant
Revocation in Offline Modeβ
For offline licenses, revocation requires:
- Issuing a new license with revocation list embedded
- Periodic "refresh" bundles (optional, configurable)
Next Stepsβ
- License Artifact Signing β Sign custom artifacts
- QuantumLock API Reference β Programmatic license management
- Enterprise Deployment β Large-scale rollout
For government and defense deployments, we offer FIPS 140-3 validated builds and on-premise license authorities. Contact enterprise@softquantus.com.