nixos/tee-supplicant: add tee-supplicant module (and more) (#237613)
This commit is contained in:
commit
6af71350c3
@ -222,6 +222,8 @@ Alongside many enhancements to NixOS modules and general system improvements, th
|
||||
|
||||
- [Limine](https://github.com/limine-bootloader/limine) a modern, advanced, portable, multiprotocol bootloader and boot manager. Available as [boot.loader.limine](#opt-boot.loader.limine.enable).
|
||||
|
||||
- [tee-supplicant](https://github.com/OP-TEE/optee_client), a userspace supplicant for OP-TEE OS. Available as [services.tee-supplicant](#opt-services.tee-supplicant.enable).
|
||||
|
||||
- [Orthanc](https://orthanc.uclouvain.be/) a lightweight, RESTful DICOM server for healthcare and medical research. Available as [services.orthanc](#opt-services.orthanc.enable).
|
||||
|
||||
- [Docling Serve](https://github.com/docling-project/docling-serve) running [Docling](https://github.com/docling-project/docling) as an API service. Available as [services.docling-serve](#opt-services.docling-serve.enable).
|
||||
|
@ -930,6 +930,7 @@
|
||||
./services/misc/taskchampion-sync-server.nix
|
||||
./services/misc/taskserver
|
||||
./services/misc/tautulli.nix
|
||||
./services/misc/tee-supplicant
|
||||
./services/misc/tiddlywiki.nix
|
||||
./services/misc/tp-auto-kbbl.nix
|
||||
./services/misc/transfer-sh.nix
|
||||
|
95
nixos/modules/services/misc/tee-supplicant/default.nix
Normal file
95
nixos/modules/services/misc/tee-supplicant/default.nix
Normal file
@ -0,0 +1,95 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
let
|
||||
inherit (lib)
|
||||
getExe'
|
||||
mkEnableOption
|
||||
mkIf
|
||||
mkOption
|
||||
mkPackageOption
|
||||
types
|
||||
;
|
||||
|
||||
cfg = config.services.tee-supplicant;
|
||||
|
||||
taDir = "optee_armtz";
|
||||
|
||||
trustedApplications = pkgs.linkFarm "runtime-trusted-applications" (
|
||||
map (
|
||||
ta:
|
||||
let
|
||||
# This is safe since we are using it as the path value, so the context
|
||||
# will still ensure that this nix store path exists on the running
|
||||
# system.
|
||||
taFile = builtins.baseNameOf (builtins.unsafeDiscardStringContext ta);
|
||||
in
|
||||
{
|
||||
name = "lib/${taDir}/${taFile}";
|
||||
path = ta;
|
||||
}
|
||||
) cfg.trustedApplications
|
||||
);
|
||||
in
|
||||
{
|
||||
options.services.tee-supplicant = {
|
||||
enable = mkEnableOption "OP-TEE userspace supplicant";
|
||||
|
||||
package = mkPackageOption pkgs "optee-client" { };
|
||||
|
||||
trustedApplications = mkOption {
|
||||
type = types.listOf types.path;
|
||||
default = [ ];
|
||||
description = ''
|
||||
A list of full paths to trusted applications that will be loaded at
|
||||
runtime by tee-supplicant.
|
||||
'';
|
||||
};
|
||||
|
||||
pluginPath = mkOption {
|
||||
type = types.path;
|
||||
default = "/run/current-system/sw/lib/tee-supplicant/plugins";
|
||||
description = ''
|
||||
The directory where plugins will be loaded from on startup.
|
||||
'';
|
||||
};
|
||||
|
||||
reeFsParentPath = mkOption {
|
||||
type = types.path;
|
||||
default = "/var/lib/tee";
|
||||
description = ''
|
||||
The directory where the secure filesystem will be stored in the rich
|
||||
execution environment (REE FS).
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
environment = mkIf (cfg.trustedApplications != [ ]) {
|
||||
systemPackages = [ trustedApplications ];
|
||||
pathsToLink = [ "/lib/${taDir}" ];
|
||||
};
|
||||
|
||||
systemd.services.tee-supplicant = {
|
||||
description = "Userspace supplicant for OPTEE-OS";
|
||||
|
||||
serviceConfig = {
|
||||
ExecStart = toString [
|
||||
(getExe' cfg.package "tee-supplicant")
|
||||
"--ta-dir ${taDir}"
|
||||
"--fs-parent-path ${cfg.reeFsParentPath}"
|
||||
"--plugin-path ${cfg.pluginPath}"
|
||||
];
|
||||
Restart = "always";
|
||||
};
|
||||
|
||||
after = [ "modprobe@optee.service" ];
|
||||
wants = [ "modprobe@optee.service" ];
|
||||
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
};
|
||||
};
|
||||
}
|
@ -1080,6 +1080,7 @@ in
|
||||
openvscode-server = runTest ./openvscode-server.nix;
|
||||
open-webui = runTest ./open-webui.nix;
|
||||
openvswitch = runTest ./openvswitch.nix;
|
||||
optee = handleTestOn [ "aarch64-linux" ] ./optee.nix { };
|
||||
orangefs = runTest ./orangefs.nix;
|
||||
os-prober = handleTestOn [ "x86_64-linux" ] ./os-prober.nix { };
|
||||
osquery = handleTestOn [ "x86_64-linux" ] ./osquery.nix { };
|
||||
|
72
nixos/tests/optee.nix
Normal file
72
nixos/tests/optee.nix
Normal file
@ -0,0 +1,72 @@
|
||||
import ./make-test-python.nix (
|
||||
{ pkgs, lib, ... }:
|
||||
{
|
||||
name = "optee";
|
||||
|
||||
meta = with pkgs.lib.maintainers; {
|
||||
maintainers = [ jmbaur ];
|
||||
};
|
||||
|
||||
nodes.machine =
|
||||
{ config, pkgs, ... }:
|
||||
let
|
||||
inherit (pkgs) armTrustedFirmwareQemu opteeQemuAarch64 ubootQemuAarch64;
|
||||
|
||||
# Default environment for qemu-arm64 uboot does not work well with
|
||||
# large nixos kernel/initrds.
|
||||
uboot = ubootQemuAarch64.overrideAttrs (old: {
|
||||
postPatch =
|
||||
(old.postPatch or "")
|
||||
+ ''
|
||||
substituteInPlace board/emulation/qemu-arm/qemu-arm.env \
|
||||
--replace-fail "ramdisk_addr_r=0x44000000" "ramdisk_addr_r=0x46000000"
|
||||
'';
|
||||
});
|
||||
|
||||
bios = armTrustedFirmwareQemu.override {
|
||||
extraMakeFlags = [
|
||||
"SPD=opteed"
|
||||
"BL32=${opteeQemuAarch64}/tee-header_v2.bin"
|
||||
"BL32_EXTRA1=${opteeQemuAarch64}/tee-pager_v2.bin"
|
||||
"BL32_EXTRA2=${opteeQemuAarch64}/tee-pageable_v2.bin"
|
||||
"BL33=${uboot}/u-boot.bin"
|
||||
"all"
|
||||
"fip"
|
||||
];
|
||||
filesToInstall = [
|
||||
"build/qemu/release/bl1.bin"
|
||||
"build/qemu/release/fip.bin"
|
||||
];
|
||||
postInstall = ''
|
||||
dd if=$out/bl1.bin of=$out/bios.bin bs=4096 conv=notrunc
|
||||
dd if=$out/fip.bin of=$out/bios.bin seek=64 bs=4096 conv=notrunc
|
||||
'';
|
||||
};
|
||||
in
|
||||
{
|
||||
virtualisation = {
|
||||
inherit bios;
|
||||
cores = 2;
|
||||
qemu.options = [
|
||||
"-machine virt,secure=on,accel=tcg,gic-version=2"
|
||||
"-cpu cortex-a57"
|
||||
];
|
||||
};
|
||||
|
||||
# VM boots up via qfw
|
||||
boot.loader.grub.enable = false;
|
||||
|
||||
services.tee-supplicant = {
|
||||
enable = true;
|
||||
# pkcs11 trusted application
|
||||
trustedApplications = [ "${opteeQemuAarch64.devkit}/ta/fd02c9da-306c-48c7-a49c-bbd827ae86ee.ta" ];
|
||||
};
|
||||
};
|
||||
testScript = ''
|
||||
machine.wait_for_unit("tee-supplicant.service")
|
||||
out = machine.succeed("${pkgs.opensc}/bin/pkcs11-tool --module ${lib.getLib pkgs.optee-client}/lib/libckteec.so --list-token-slots")
|
||||
if out.find("OP-TEE PKCS11 TA") < 0:
|
||||
raise Exception("optee pkcs11 token not found")
|
||||
'';
|
||||
}
|
||||
)
|
72
pkgs/by-name/op/optee-client/package.nix
Normal file
72
pkgs/by-name/op/optee-client/package.nix
Normal file
@ -0,0 +1,72 @@
|
||||
{
|
||||
fetchFromGitHub,
|
||||
isNixOS ? true,
|
||||
lib,
|
||||
libuuid,
|
||||
pkg-config,
|
||||
stdenv,
|
||||
which,
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "optee-client";
|
||||
version = "4.6.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "OP-TEE";
|
||||
repo = "optee_client";
|
||||
rev = finalAttrs.version;
|
||||
hash = "sha256-hHEIn0WU4XfqwZbOdg9kwSDxDcvK7Tvxtelamfc3IRM=";
|
||||
};
|
||||
|
||||
outputs = [
|
||||
"out"
|
||||
"lib"
|
||||
"dev"
|
||||
];
|
||||
|
||||
strictDeps = true;
|
||||
|
||||
enableParallelBuilding = true;
|
||||
|
||||
nativeBuildInputs = [
|
||||
which
|
||||
pkg-config
|
||||
];
|
||||
buildInputs = [ libuuid ];
|
||||
|
||||
makeFlags =
|
||||
[
|
||||
"CROSS_COMPILE=${stdenv.cc.targetPrefix}"
|
||||
"DESTDIR=$(out)"
|
||||
"SBINDIR=/bin"
|
||||
"INCLUDEDIR=/include"
|
||||
"LIBDIR=/lib"
|
||||
]
|
||||
++
|
||||
# If we are building for NixOS, change default optee config to use paths
|
||||
# that will work well with NixOS.
|
||||
lib.optionals isNixOS [
|
||||
"CFG_TEE_CLIENT_LOAD_PATH=/run/current-system/sw/lib"
|
||||
"CFG_TEE_PLUGIN_LOAD_PATH=/run/current-system/sw/lib/tee-supplicant/plugins"
|
||||
"CFG_TEE_FS_PARENT_PATH=/var/lib/tee"
|
||||
];
|
||||
|
||||
preFixup = ''
|
||||
mkdir -p "$lib" "$dev"
|
||||
mv "$out/lib" "$lib"
|
||||
mv "$out/include" "$dev"
|
||||
'';
|
||||
|
||||
meta = {
|
||||
description = "Normal world client for OPTEE OS";
|
||||
homepage = "https://github.com/OP-TEE/optee_client";
|
||||
changelog = "https://github.com/OP-TEE/optee_client/releases/tag/${finalAttrs.version}";
|
||||
license = lib.licenses.bsd2;
|
||||
maintainers = [ lib.maintainers.jmbaur ];
|
||||
platforms = [
|
||||
"aarch64-linux"
|
||||
"armv7l-linux"
|
||||
];
|
||||
};
|
||||
})
|
@ -18,7 +18,7 @@
|
||||
}:
|
||||
|
||||
let
|
||||
buildArmTrustedFirmware =
|
||||
buildArmTrustedFirmware = lib.makeOverridable (
|
||||
{
|
||||
filesToInstall,
|
||||
installDir ? "$out",
|
||||
@ -59,8 +59,11 @@ let
|
||||
|
||||
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
||||
|
||||
# For Cortex-M0 firmware in RK3399
|
||||
nativeBuildInputs = [ pkgsCross.arm-embedded.stdenv.cc ];
|
||||
nativeBuildInputs = [
|
||||
pkgsCross.arm-embedded.stdenv.cc # For Cortex-M0 firmware in RK3399
|
||||
openssl # For fiptool
|
||||
];
|
||||
|
||||
# Make the new toolchain guessing (from 2.11+) happy
|
||||
# https://github.com/ARM-software/arm-trusted-firmware/blob/4ec2948fe3f65dba2f19e691e702f7de2949179c/make_helpers/toolchains/rk3399-m0.mk#L21-L22
|
||||
rk3399-m0-oc = "${pkgsCross.arm-embedded.stdenv.cc.targetPrefix}objcopy";
|
||||
@ -112,7 +115,8 @@ let
|
||||
// extraMeta;
|
||||
}
|
||||
// builtins.removeAttrs args [ "extraMeta" ]
|
||||
);
|
||||
)
|
||||
);
|
||||
|
||||
in
|
||||
{
|
||||
|
127
pkgs/misc/optee-os/default.nix
Normal file
127
pkgs/misc/optee-os/default.nix
Normal file
@ -0,0 +1,127 @@
|
||||
{
|
||||
dtc,
|
||||
fetchFromGitHub,
|
||||
lib,
|
||||
pkgsBuildBuild,
|
||||
stdenv,
|
||||
}:
|
||||
|
||||
let
|
||||
defaultVersion = "4.6.0";
|
||||
|
||||
defaultSrc = fetchFromGitHub {
|
||||
owner = "OP-TEE";
|
||||
repo = "optee_os";
|
||||
rev = defaultVersion;
|
||||
hash = "sha256-4z706DNfZE+CAPOa362CNSFhAN1KaNyKcI9C7+MRccs=";
|
||||
};
|
||||
|
||||
buildOptee = lib.makeOverridable (
|
||||
{
|
||||
version ? null,
|
||||
src ? null,
|
||||
platform,
|
||||
extraMakeFlags ? [ ],
|
||||
extraMeta ? { },
|
||||
...
|
||||
}@args:
|
||||
|
||||
let
|
||||
inherit (stdenv.hostPlatform) is32bit is64bit;
|
||||
|
||||
taTarget =
|
||||
{
|
||||
"arm" = "ta_arm32";
|
||||
"arm64" = "ta_arm64";
|
||||
}
|
||||
.${stdenv.hostPlatform.linuxArch};
|
||||
in
|
||||
stdenv.mkDerivation (
|
||||
{
|
||||
pname = "optee-os-${platform}";
|
||||
|
||||
version = if src == null then defaultVersion else version;
|
||||
|
||||
src = if src == null then defaultSrc else src;
|
||||
|
||||
postPatch = ''
|
||||
patchShebangs $(find -type d -name scripts -printf '%p ')
|
||||
'';
|
||||
|
||||
outputs = [
|
||||
"out"
|
||||
"devkit"
|
||||
];
|
||||
|
||||
strictDeps = true;
|
||||
|
||||
enableParallelBuilding = true;
|
||||
|
||||
depsBuildBuild = [ pkgsBuildBuild.stdenv.cc ];
|
||||
|
||||
nativeBuildInputs = [
|
||||
dtc
|
||||
(pkgsBuildBuild.python3.withPackages (
|
||||
p: with p; [
|
||||
pyelftools
|
||||
cryptography
|
||||
]
|
||||
))
|
||||
];
|
||||
|
||||
makeFlags =
|
||||
[
|
||||
"O=out"
|
||||
"PLATFORM=${platform}"
|
||||
"CFG_USER_TA_TARGETS=${taTarget}"
|
||||
]
|
||||
++ (lib.optionals (is32bit) [
|
||||
"CFG_ARM32_core=y"
|
||||
"CROSS_COMPILE32=${stdenv.cc.targetPrefix}"
|
||||
])
|
||||
++ (lib.optionals (is64bit) [
|
||||
"CFG_ARM64_core=y"
|
||||
"CROSS_COMPILE64=${stdenv.cc.targetPrefix}"
|
||||
])
|
||||
++ extraMakeFlags;
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out
|
||||
cp out/core/{tee.elf,tee-pageable_v2.bin,tee.bin,tee-header_v2.bin,tee-pager_v2.bin,tee-raw.bin} $out
|
||||
cp -r out/export-${taTarget} $devkit
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
meta =
|
||||
with lib;
|
||||
{
|
||||
description = "A Trusted Execution Environment for ARM";
|
||||
homepage = "https://github.com/OP-TEE/optee_os";
|
||||
changelog = "https://github.com/OP-TEE/optee_os/blob/${defaultVersion}/CHANGELOG.md";
|
||||
license = licenses.bsd2;
|
||||
maintainers = [ maintainers.jmbaur ];
|
||||
}
|
||||
// extraMeta;
|
||||
}
|
||||
// removeAttrs args [ "extraMeta" ]
|
||||
)
|
||||
);
|
||||
in
|
||||
{
|
||||
inherit buildOptee;
|
||||
|
||||
opteeQemuArm = buildOptee {
|
||||
platform = "vexpress";
|
||||
extraMakeFlags = [ "PLATFORM_FLAVOR=qemu_virt" ];
|
||||
extraMeta.platforms = [ "armv7l-linux" ];
|
||||
};
|
||||
|
||||
opteeQemuAarch64 = buildOptee {
|
||||
platform = "vexpress";
|
||||
extraMakeFlags = [ "PLATFORM_FLAVOR=qemu_armv8a" ];
|
||||
extraMeta.platforms = [ "aarch64-linux" ];
|
||||
};
|
||||
}
|
@ -7432,6 +7432,12 @@ with pkgs;
|
||||
libiberty_static = libiberty.override { staticBuild = true; };
|
||||
};
|
||||
|
||||
inherit (callPackage ../misc/optee-os { })
|
||||
buildOptee
|
||||
opteeQemuArm
|
||||
opteeQemuAarch64
|
||||
;
|
||||
|
||||
patchelf = callPackage ../development/tools/misc/patchelf { };
|
||||
|
||||
patchelfUnstable = lowPrio (callPackage ../development/tools/misc/patchelf/unstable.nix { });
|
||||
|
Loading…
x
Reference in New Issue
Block a user