trunksd.cc revision 4ede7fcc1571b23867536b2506900fc3987c2dd5
1c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi// Copyright 2014 The Chromium OS Authors. All rights reserved.
2c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi// Use of this source code is governed by a BSD-style license that can be
3c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi// found in the LICENSE file.
4c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi
5c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi#include <base/at_exit.h>
64ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn#include <base/bind.h>
7c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi#include <base/command_line.h>
8c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi#include <base/message_loop/message_loop.h>
980c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn#include <base/threading/thread.h>
1080c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn#include <chromeos/libminijail.h>
1180c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn#include <chromeos/minijail/minijail.h>
12c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi#include <chromeos/syslog_logging.h>
13c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi
1480c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn#include "trunks/background_command_transceiver.h"
154ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn#include "trunks/resource_manager.h"
1680c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn#include "trunks/tpm_handle.h"
174ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn#include "trunks/trunks_factory_impl.h"
18c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi#include "trunks/trunks_service.h"
19c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi
2080c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahnnamespace {
2180c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn
2280c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahnconst uid_t kTrunksUID = 251;
2380c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahnconst uid_t kRootUID = 0;
2480c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahnconst char kTrunksUser[] = "trunks";
2580c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahnconst char kTrunksGroup[] = "trunks";
2680c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahnconst char kTrunksSeccompPath[] = "/usr/share/policy/trunksd-seccomp.policy";
2780c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahnconst char kBackgroundThreadName[] = "trunksd_background_thread";
2880c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn
2980c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahnvoid InitMinijailSandbox() {
3080c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  CHECK_EQ(getuid(), kRootUID) << "Trunks Daemon not initialized as root.";
3180c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  chromeos::Minijail* minijail = chromeos::Minijail::GetInstance();
3280c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  struct minijail* jail = minijail->New();
3380c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  minijail->UseSeccompFilter(jail, kTrunksSeccompPath);
344ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  minijail->DropRoot(jail, kTrunksUser, kTrunksGroup);
3580c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  minijail->Enter(jail);
3680c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  minijail->Destroy(jail);
3780c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  CHECK_EQ(getuid(), kTrunksUID)
3880c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn      << "Trunks Daemon was not able to drop to trunks user.";
3980c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn}
4080c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn
4180c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn}  // namespace
42c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi
43c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghiint main(int argc, char **argv) {
443978ff0bfabc5f04798851e003d3dc372280a989Alex Vakulenko  base::CommandLine::Init(argc, argv);
45c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi  chromeos::InitLog(chromeos::kLogToSyslog | chromeos::kLogToStderr);
46c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi  base::AtExitManager at_exit_manager;
474ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  // Open a handle to the TPM and drop privilege.
484ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  trunks::TpmHandle tpm_handle;
494ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  CHECK(tpm_handle.Init());
504ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  InitMinijailSandbox();
514ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  // A main message loop. This loop will process all incoming and outgoing IPC
524ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  // messages. It *must* not block on the TPM.
53c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi  base::MessageLoopForIO message_loop;
5480c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  // A thread for executing TPM commands.
5580c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  base::Thread background_thread(kBackgroundThreadName);
5680c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  CHECK(background_thread.Start());
574ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  // Chain together command transceivers:
584ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  //   [IPC] --> TrunksService --> BackgroundCommandTransceiver -->
594ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  //       ResourceManager --> TpmHandle --> [TPM]
604ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  trunks::Tpm tpm(&tpm_handle);
614ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  trunks::TrunksFactoryImpl factory(&tpm);
624ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  trunks::ResourceManager resource_manager(factory, &tpm_handle);
634ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  // Schedule resource manager initialization in the background.
644ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn  background_thread.message_loop_proxy()->PostNonNestableTask(
654ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn      FROM_HERE,
664ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn      base::Bind(&trunks::ResourceManager::Initialize,
674ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn                 base::Unretained(&resource_manager)));
6880c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  trunks::BackgroundCommandTransceiver background_transceiver(
694ede7fcc1571b23867536b2506900fc3987c2dd5Darren Krahn      &resource_manager,
7080c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn      background_thread.message_loop_proxy());
7180c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  trunks::TrunksService service(&background_transceiver);
7280c739e10fd606b24e2656cad6e566c66bb218d4Darren Krahn  service.Init();
73c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi  LOG(INFO) << "Trunks service started!";
74c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi  message_loop.Run();
75c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi  return -1;
76c2be426142cd74b3136b2670f3feb92fb92923cbUtkarsh Sanghi}
77