nixcfg/modules/nixos/security/gpg/default.nix

119 lines
3.1 KiB
Nix
Raw Normal View History

2024-01-11 11:26:46 +01:00
{ options
, config
, pkgs
, lib
, inputs
, ...
}:
with lib;
with lib.plusultra; let
cfg = config.plusultra.security.gpg;
gpgConf = "${inputs.gpg-base-conf}/gpg.conf";
gpgAgentConf = ''
enable-ssh-support
default-cache-ttl 60
max-cache-ttl 120
pinentry-program ${pkgs.pinentry-gnome}/bin/pinentry-gnome3
'';
guide = "${inputs.yubikey-guide}/README.md";
theme = pkgs.fetchFromGitHub {
owner = "jez";
repo = "pandoc-markdown-css-theme";
rev = "019a4829242937761949274916022e9861ed0627";
sha256 = "1h48yqffpaz437f3c9hfryf23r95rr319lrb3y79kxpxbc9hihxb";
};
guideHTML = pkgs.runCommand "yubikey-guide" { } ''
${pkgs.pandoc}/bin/pandoc \
--standalone \
--metadata title="Yubikey Guide" \
--from markdown \
--to html5+smart \
--toc \
--template ${theme}/template.html5 \
--css ${theme}/docs/css/theme.css \
--css ${theme}/docs/css/skylighting-solarized-theme.css \
-o $out \
${guide}
'';
guideDesktopItem = pkgs.makeDesktopItem {
name = "yubikey-guide";
desktopName = "Yubikey Guide";
genericName = "View Yubikey Guide in a web browser";
exec = "${pkgs.xdg-utils}/bin/xdg-open ${guideHTML}";
icon = ./yubico-icon.svg;
categories = [ "System" ];
};
reload-yubikey = pkgs.writeShellScriptBin "reload-yubikey" ''
${pkgs.gnupg}/bin/gpg-connect-agent "scd serialno" "learn --force" /bye
'';
in
{
options.plusultra.security.gpg = with types; {
enable = mkBoolOpt false "Whether or not to enable GPG.";
agentTimeout = mkOpt int 5 "The amount of time to wait before continuing with shell init.";
};
config = mkIf cfg.enable {
services.pcscd.enable = true;
services.udev.packages = with pkgs; [ yubikey-personalization ];
# NOTE: This should already have been added by programs.gpg, but
# keeping it here for now just in case.
environment.shellInit = ''
export GPG_TTY="$(tty)"
export SSH_AUTH_SOCK=$(${pkgs.gnupg}/bin/gpgconf --list-dirs agent-ssh-socket)
${pkgs.coreutils}/bin/timeout ${builtins.toString cfg.agentTimeout} ${pkgs.gnupg}/bin/gpgconf --launch gpg-agent
gpg_agent_timeout_status=$?
if [ "$gpg_agent_timeout_status" = 124 ]; then
# Command timed out...
echo "GPG Agent timed out..."
echo 'Run "gpgconf --launch gpg-agent" to try and launch it again.'
fi
'';
environment.systemPackages = with pkgs; [
cryptsetup
paperkey
gnupg
pinentry-curses
pinentry-qt
pinentry-gnome
paperkey
guideDesktopItem
reload-yubikey
];
programs = {
ssh.startAgent = false;
gnupg.agent = {
enable = true;
enableSSHSupport = true;
enableExtraSocket = true;
pinentryFlavor = "gnome3";
};
};
plusultra = {
home.file = {
".gnupg/.keep".text = "";
".gnupg/yubikey-guide.md".source = guide;
".gnupg/yubikey-guide.html".source = guideHTML;
".gnupg/gpg.conf".source = gpgConf;
".gnupg/gpg-agent.conf".text = gpgAgentConf;
};
};
};
}