Skip to main content

Security features

Avocado OS splits every security feature into two decisions, made by two different parties:

DecisionWho makes itWhere
Can this machine deliver the feature?The board's BSPAVOCADO_SECURITY_CAPABILITIES in the machine config
Does this product use it?Youavocado.yaml, via the Avocado CLI

The published feed builds everything the machine declares — kernel options, initramfs tooling, rootfs helpers, partition layout — so that you can make the second decision later, per runtime, without rebuilding the distro. A runtime that does not opt in behaves exactly as if the capability did not exist.

That is why enabling encrypted /var or dm-verity on a supported board is a few lines of avocado.yaml and a rebuild, not a Yocto exercise.

The knobs​

FeatureConfigGuide
Encrypted /var (LUKS2, hardware-bound key)runtimes.<name>.var.encryptEncrypted /var
Which key engine binds /varruntimes.<name>.var.hardwareEncrypted /var
Operator-held /var recovery keyruntimes.<name>.var.recoveryEncrypted /var
dm-verity on the rootfsrootfs.image.verityFilesystem verity
dm-verity on an extensionextensions.<name>.image.verityFilesystem verity
Signed boot FITruntimes.<name>.signing.fit_keyBoot signing
Bootloader enforces your keyruntimes.<name>.signing.fit_key_in_bootloaderBoot signing

Signing keys themselves live in a machine-local registry managed by avocado signing-keys — nothing secret is committed to avocado.yaml, which names keys only.

What a board supports​

A machine's declaration is shipped to the device as /etc/avocado-security-capabilities, so on-device tooling can refuse to do something the image was never built for:

Target device
cat /etc/avocado-security-capabilities
# encrypted-var verified-boot

Current state of the published 2026 (wrynose) feed. This table is a snapshot of each machine's AVOCADO_SECURITY_CAPABILITIES declaration in its meta-avocado machine conf; if the two ever disagree, the conf is authoritative. In the verity and boot FIT columns, n/a means the platform has no such mechanism, and no means the machine does not build or declare it today.

TargetEncrypted /varSigned boot FITRootfs verityDeclared capabilities
imx8mp-evkyesyesyesencrypted-var verified-boot - CAAM-backed key
imx93-frdmyesyesyesencrypted-var verified-boot - plus ftpm tpm2 with OP-TEE; AHAB available
imx91-frdmnot yet declarednohash partitions staged, no FITAHAB boot-container signing only
imx93-evk, imx95-frdm, imx8mp-var-dart, ucm-imx8m-plusnot yet declarednohash partitions staged, no FITbooti boot flow
jetson-*yesn/a - NVIDIA boot chain, no U-Boot FITn/a - no boot FIT to carry the root hashencrypted-var ftpm tpm2 - key sealed to the OP-TEE fTPM
qemuarm64yesnonoencrypted-var ftpm tpm2
qemux86-64yesnonoencrypted-var tpm2
intel-x86-64-v2/v3/v4not yet declarednonotpm2
raspberrypi*nonono"" - MBR layout, no dm-crypt kernel fragment yet

Read from the 2026 (wrynose) machine confs on 2026-10-02.

Extension dm-verity is not in this table because it does not depend on the machine: it is carried in the runtime manifest and applied by avocadoctl, so extensions.<name>.image.verity works on every target running avocadoctl 0.11.0 or newer. Only rootfs verity needs the boot FIT and the per-slot hash partitions above.

A board that is not listed as declaring a capability is not broken — it has not been wired up for it. See adding a machine target in meta-avocado.

Order of operations for a fleet​

An OS update is applied by the avocadoctl already on the device, so a fix in the apply path never helps the update that carries it.

  1. Ship the current avocadoctl in a plain OS update first.
  2. Then turn on the manifest-level feature (image.verity, var.encrypt) and ship that.

Two transitions are one-way and need a reprovision rather than an update:

  • Turning var.encrypt off after a device has encrypted. The partition stays LUKS; nothing opens it; /var does not mount.
  • Moving a device onto a new partition layout. An update cannot add partitions.