feat(build): native add-on per-arch artifact signer (agent-release ed25519) (#3425) #3474
No reviewers
Labels
No labels
1week
2weeks
Failed compliance check
IP cameras
NATS
Possible security concern
Review effort 1/5
Review effort 2/5
Review effort 3/5
Review effort 4/5
Review effort 5/5
UI
aardvark
accessibility
amd64
api
arm64
auth
back-end
bgp
blog
bug
build
checkers
ci-cd
cleanup
cnpg
codex
core
dependencies
device-management
documentation
duplicate
dusk
ebpf
enhancement
eta 1d
eta 1hr
eta 3d
eta 3hr
feature
fieldsurvey
github_actions
go
good first issue
help wanted
invalid
javascript
k8s
log-collector
mapper
mtr
needs-triage
netflow
network-sweep
observability
oracle
otel
plug-in
proton
python
question
reddit
redhat
research
rperf
rperf-checker
rust
sdk
security
serviceradar-agent
serviceradar-agent-gateway
serviceradar-web
serviceradar-web-ng
siem
snmp
sysmon
topology
ubiquiti
wasm
wontfix
zen-engine
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
carverauto/serviceradar!3474
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/native-addon-artifact-signer"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
The per-arch artifact signer — the agent-facing core of build-signing §2.2, and the one piece native add-ons need that the WASM pipeline has no analogue for.
The agent verifies a pushed-artifact with
verifyAddonArtifactSignature→ed25519.Verify(releasePublicKey, rawArtifactBytes, signature), reusing the existing agent release trust root (SERVICERADAR_AGENT_RELEASE_PUBLIC_KEY, per the 3425 "share the existing signing key" decision). This adds the producer: a stdlib-only tool that signs each per-arch tarball (or bare binary) with the agent release key and emits exactly the raw ed25519 signature the agent accepts — the value the control plane records as theAddonAssignment'sartifact_signature.(Distinct from the two WASM-shared signatures: cosign over the OCI bundle, and the
PLUGIN_UPLOAD_SIGNINGed25519 upload-signature over the bundle. This is the third, per-arch, agent-verified one.)build/native_addons/addon_artifact_signature_tool.gosign --artifact <f> [--out]→hex(ed25519.Sign(<release-priv>, bytes))verify --artifact <f> --signature <hex|base64|@file>→ed25519.Verifywith the release public key, decoding hex + the 4 base64 variants exactly like the agent'sdecodeReleaseSignaturepublic-key→ hex public key (derives from the private key when the public env is unset)SERVICERADAR_AGENT_RELEASE_PRIVATE_KEY/_PUBLIC_KEY) — never committedBUILD.bazel:go_binary+go_test(no external deps)Verification
@filesignature input works.ed25519.Verify-over-raw-bytes contract, seed/full-key acceptance, public-key derivation, key-unset failure, and every accepted encoding.go test ./build/native_addons/passes;gofmt+buildifierclean;bazel query //build/native_addons:allloads with the new targets.Next (build-signing remainder)
The orchestration on top:
sign/index/verifywrapper scripts, the cosign OCI bundle signing + thePLUGIN_UPLOAD_SIGNINGupload-signature (reusescripts/cosign_common.sh+upload_signature_tool+ the WASM rails),serviceradar-native-addon-index.json, and the.forgejo/workflows/native-addons.ymllane. Production signing runs in CI where the release/upload/cosign keys live.🤖 Generated with Claude Code
lgtm