152 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| # tcsd daemon.
 | |
| 
 | |
| { config, pkgs, lib, ... }:
 | |
| 
 | |
| with lib;
 | |
| let
 | |
| 
 | |
|   cfg = config.services.tcsd;
 | |
| 
 | |
|   tcsdConf = pkgs.writeText "tcsd.conf" ''
 | |
|     port = 30003
 | |
|     num_threads = 10
 | |
|     system_ps_file = ${cfg.stateDir}/system.data
 | |
|     # This is the log of each individual measurement done by the system.
 | |
|     # By re-calculating the PCR registers based on this information, even
 | |
|     # finer details about the measured environment can be inferred than
 | |
|     # what is available directly from the PCR registers.
 | |
|     firmware_log_file = /sys/kernel/security/tpm0/binary_bios_measurements
 | |
|     kernel_log_file = /sys/kernel/security/ima/binary_runtime_measurements
 | |
|     firmware_pcrs = ${cfg.firmwarePCRs}
 | |
|     kernel_pcrs = ${cfg.kernelPCRs}
 | |
|     platform_cred = ${cfg.platformCred}
 | |
|     conformance_cred = ${cfg.conformanceCred}
 | |
|     endorsement_cred = ${cfg.endorsementCred}
 | |
|     #remote_ops = create_key,random
 | |
|     #host_platform_class = server_12
 | |
|     #all_platform_classes = pc_11,pc_12,mobile_12
 | |
|   '';
 | |
| 
 | |
| in
 | |
| {
 | |
| 
 | |
|   ###### interface
 | |
| 
 | |
|   options = {
 | |
| 
 | |
|     services.tcsd = {
 | |
| 
 | |
|       enable = mkOption {
 | |
|         default = false;
 | |
|         type = types.bool;
 | |
|         description = ''
 | |
|           Whether to enable tcsd, a Trusted Computing management service
 | |
|           that provides TCG Software Stack (TSS).  The tcsd daemon is
 | |
|           the only portal to the Trusted Platform Module (TPM), a hardware
 | |
|           chip on the motherboard.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       user = mkOption {
 | |
|         default = "tss";
 | |
|         type = types.string;
 | |
|         description = "User account under which tcsd runs.";
 | |
|       };
 | |
| 
 | |
|       group = mkOption {
 | |
|         default = "tss";
 | |
|         type = types.string;
 | |
|         description = "Group account under which tcsd runs.";
 | |
|       };
 | |
| 
 | |
|       stateDir = mkOption {
 | |
|         default = "/var/lib/tpm";
 | |
|         type = types.path;
 | |
|         description = ''
 | |
|           The location of the system persistent storage file.
 | |
|           The system persistent storage file holds keys and data across
 | |
|           restarts of the TCSD and system reboots. 
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       firmwarePCRs = mkOption {
 | |
|         default = "0,1,2,3,4,5,6,7";
 | |
|         type = types.string;
 | |
|         description = "PCR indices used in the TPM for firmware measurements.";
 | |
|       };
 | |
| 
 | |
|       kernelPCRs = mkOption {
 | |
|         default = "8,9,10,11,12";
 | |
|         type = types.string;
 | |
|         description = "PCR indices used in the TPM for kernel measurements.";
 | |
|       };
 | |
| 
 | |
|       platformCred = mkOption {
 | |
|         default = "${cfg.stateDir}/platform.cert";
 | |
|         type = types.path;
 | |
|         description = ''
 | |
|           Path to the platform credential for your TPM. Your TPM
 | |
|           manufacturer may have provided you with a set of credentials
 | |
|           (certificates) that should be used when creating identities
 | |
|           using your TPM. When a user of your TPM makes an identity,
 | |
|           this credential will be encrypted as part of that process.
 | |
|           See the 1.1b TPM Main specification section 9.3 for information
 | |
|           on this process. '';
 | |
|       };
 | |
| 
 | |
|       conformanceCred = mkOption {
 | |
|         default = "${cfg.stateDir}/conformance.cert";
 | |
|         type = types.path;
 | |
|         description = ''
 | |
|           Path to the conformance credential for your TPM.
 | |
|           See also the platformCred option'';
 | |
|       };
 | |
| 
 | |
|       endorsementCred = mkOption {
 | |
|         default = "${cfg.stateDir}/endorsement.cert";
 | |
|         type = types.path;
 | |
|         description = ''
 | |
|           Path to the endorsement credential for your TPM.
 | |
|           See also the platformCred option'';
 | |
|       };
 | |
|     };
 | |
| 
 | |
|   };
 | |
| 
 | |
|   ###### implementation
 | |
| 
 | |
|   config = mkIf cfg.enable {
 | |
| 
 | |
|     environment.systemPackages = [ pkgs.trousers ];
 | |
| 
 | |
| #    system.activationScripts.tcsd =
 | |
| #      ''
 | |
| #        chown ${cfg.user}:${cfg.group} ${tcsdConf}
 | |
| #      '';
 | |
| 
 | |
|     systemd.services.tcsd = {
 | |
|       description = "TCSD";
 | |
|       after = [ "systemd-udev-settle.service" ];
 | |
|       wantedBy = [ "multi-user.target" ];
 | |
|       path = [ pkgs.trousers ];
 | |
|       preStart =
 | |
|         ''
 | |
|         mkdir -m 0700 -p ${cfg.stateDir}
 | |
|         chown -R ${cfg.user}:${cfg.group} ${cfg.stateDir}
 | |
|         '';
 | |
|       serviceConfig.ExecStart = "${pkgs.trousers}/sbin/tcsd -f -c ${tcsdConf}";
 | |
|     };
 | |
| 
 | |
|     users.users = optionalAttrs (cfg.user == "tss") (singleton
 | |
|       { name = "tss";
 | |
|         group = "tss";
 | |
|         uid = config.ids.uids.tss;
 | |
|       });
 | |
| 
 | |
|     users.groups = optionalAttrs (cfg.group == "tss") (singleton
 | |
|       { name = "tss";
 | |
|         gid = config.ids.gids.tss;
 | |
|       });
 | |
|   };
 | |
| }
 | 
