docs: correct licence scheme to ECDSA P-384 with SHA-256

hyperboloide/lk signs with ECDSA P-384 and SHA-256, not ed25519, and encodes
keys as base32 rather than hex. Probed in task 1 of the licensing-core plan.
Design is unaffected — only the prose was wrong.
This commit is contained in:
2026-07-24 14:56:36 +01:00
parent f10fe61916
commit a50219c0d9
5 changed files with 9 additions and 9 deletions
@@ -849,7 +849,7 @@ Expected: no output.
- [ ] **Step 6: Rate-limit the licence endpoint**
There is no oracle here worth protecting — the blob is signed public data — but an
unbounded verify endpoint is an unbounded CPU endpoint, and ed25519 verification
unbounded verify endpoint is an unbounded CPU endpoint, and signature verification
is not free.
Add to `server/internal/api/licence.go`:
@@ -2,11 +2,11 @@
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Add `shared/license`, the ed25519-signed licence payload with offline verification, plus `lkctl` to issue licences by hand.
**Goal:** Add `shared/license`, the signed licence payload with offline verification, plus `lkctl` to issue licences by hand.
**Architecture:** A new package inside the existing `shared` module, so the control plane (verifier) and the future admin service (signer) read one struct definition. Signing is excluded from the server binary by a build tag; the trusted public keys are compiled in as a slice. No network calls anywhere — verification checks a signature, an expiry, a deployment mode and an instance ID, and asks nobody's permission.
**Tech Stack:** Go 1.26, `github.com/hyperboloide/lk` (ed25519 + base32), the existing `shared` module.
**Tech Stack:** Go 1.26, `github.com/hyperboloide/lk` (ECDSA P-384 + SHA-256, base32), the existing `shared` module.
**No automated tests.** Verification is by compiler, a probe command, and `lkctl` round trips at the command line. Every task ends with observable output.
@@ -168,7 +168,7 @@ Create `shared/license/license.go`:
// Package license defines the Vantage licence payload and its offline
// verification.
//
// A licence is an ed25519-signed blob. The server checks a signature, an
// A licence is a signed blob (ECDSA P-384 with SHA-256). The server checks a signature, an
// expiry, a deployment mode and an instance ID, and asks nobody's permission.
// That buys air-gapped self-hosting and means no instance depends on the
// licensing service being reachable.