{ config, lib, pkgs, ... }: with lib; let cfg = config.local.boot.stack.luksExt4FscryptImpermanence; in { options.local.boot.stack.luksExt4FscryptImpermanence = { enable = mkEnableOption "filesystem stack: whatever LUKS approach+ext4+impermanence with per-boot keys"; target = mkOption { type = types.str; }; persistInToplevel = mkOption { type = types.bool; default = true; }; }; # - boot device # - some unknown fs, probably vfat # - detached luks header file # # - toplevel device # - headerless luks # - /toplevel (ext4) # - /toplevel/nix (if !cfg.persistInToplevel) # - /toplevel/persist (if cfg.persistInToplevel) # - /toplevel/persist/nix # - /toplevel/boot-archive.pub # - /toplevel/boot-keys # - /toplevel/boot-keys/2000-01-01T00:00:00-06:00.key.age (encrypted for /toplevel/boot-archive.pub) # - /toplevel/boot-keys/... # - /toplevel/boot-keys/last.key.age -> 2000-01-01T00:00:00-06:00.key.age # - /toplevel/boots # - /toplevel/boots/2000-01-01T00:00:00-06:00 (raw protector in last.key.age) # - /toplevel/boots/... # - /toplevel/boots/last -> 2000-01-01T00:00:00-06:00 (mounted as /) config = mkIf cfg.enable { boot.initrd.luks.devices.${cfg.target}.postOpenCommands = let fscryptctl = "${pkgs.fscryptctl}/bin/fscryptctl"; in '' # FIXME: posiblemente algunos --make-* son innecesarios a partir de aquĆ­ mkdir -p /mnt-root /mnt-toplevel mount -o noatime /dev/mapper/${cfg.target} /mnt-toplevel mount --make-private /mnt-toplevel boot_stamp="$(date -Is)" root_from_toplevel="/mnt-toplevel/boots/$boot_stamp" mkdir -p "$root_from_toplevel" /mnt-toplevel/boot-keys chmod 700 /mnt-toplevel/boot-keys head -c64 /dev/urandom >/boot-key key_id=$(${fscryptctl} add_key /mnt-toplevel