13daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
23daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Copyright (C) 2015 The Android Open Source Project
33daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
43daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
53daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// you may not use this file except in compliance with the License.
63daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// You may obtain a copy of the License at
73daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
83daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
93daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
103daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
113daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
123daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// See the License for the specific language governing permissions and
143daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// limitations under the License.
153daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
166bead48129845a2bc0d6ff347f3d7e232004d59Nam T. Nguyen
17ab0cddda9971f97781fc9f6cbc76095ba7542abfAlex Vakulenko#ifndef ATTESTATION_SERVER_ATTESTATION_SERVICE_H_
18ab0cddda9971f97781fc9f6cbc76095ba7542abfAlex Vakulenko#define ATTESTATION_SERVER_ATTESTATION_SERVICE_H_
196bead48129845a2bc0d6ff347f3d7e232004d59Nam T. Nguyen
20b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include "attestation/common/attestation_interface.h"
216bead48129845a2bc0d6ff347f3d7e232004d59Nam T. Nguyen
2230a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn#include <memory>
23b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <string>
246bead48129845a2bc0d6ff347f3d7e232004d59Nam T. Nguyen
25d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn#include <base/callback.h>
2630a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn#include <base/macros.h>
27d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn#include <base/memory/weak_ptr.h>
28d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn#include <base/threading/thread.h>
29e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko#include <brillo/bind_lambda.h>
30e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko#include <brillo/http/http_transport.h>
3130a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn
32745de272a4afde07cd3b3a7c376976bd0a972b36Darren Krahn#include "attestation/common/crypto_utility.h"
33745de272a4afde07cd3b3a7c376976bd0a972b36Darren Krahn#include "attestation/common/crypto_utility_impl.h"
34745de272a4afde07cd3b3a7c376976bd0a972b36Darren Krahn#include "attestation/common/tpm_utility.h"
35745de272a4afde07cd3b3a7c376976bd0a972b36Darren Krahn#include "attestation/common/tpm_utility_v1.h"
3630a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn#include "attestation/server/database.h"
37d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn#include "attestation/server/database_impl.h"
38d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn#include "attestation/server/key_store.h"
3959d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn#include "attestation/server/pkcs11_key_store.h"
4030a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn
416bead48129845a2bc0d6ff347f3d7e232004d59Nam T. Nguyennamespace attestation {
426bead48129845a2bc0d6ff347f3d7e232004d59Nam T. Nguyen
430752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn// An implementation of AttestationInterface for the core attestation service.
44d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// Access to TPM, network and local file-system resources occurs asynchronously
45d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// with the exception of Initialize(). All methods must be called on the same
46d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// thread that originally called Initialize().
47b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn// Usage:
48b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn//   std::unique_ptr<AttestationInterface> attestation =
49b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn//       new AttestationService();
50b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn//   CHECK(attestation->Initialize());
51b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn//   attestation->CreateGoogleAttestedKey(...);
52d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn//
53d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// THREADING NOTES:
54d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// This class runs a worker thread and delegates all calls to it. This keeps the
55d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// public methods non-blocking while allowing complex implementation details
56d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// with dependencies on the TPM, network, and filesystem to be coded in a more
57d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// readable way. It also serves to serialize method execution which reduces
58d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// complexity with TPM state.
59d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn//
60d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// Tasks that run on the worker thread are bound with base::Unretained which is
61d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// safe because the thread is owned by this class (so it is guaranteed not to
62d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// process a task after destruction). Weak pointers are used to post replies
63d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn// back to the main thread.
64b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnclass AttestationService : public AttestationInterface {
656bead48129845a2bc0d6ff347f3d7e232004d59Nam T. Nguyen public:
66d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  AttestationService();
67b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  ~AttestationService() override = default;
68b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
69b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  // AttestationInterface methods.
70b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  bool Initialize() override;
710752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  void CreateGoogleAttestedKey(
72b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn      const CreateGoogleAttestedKeyRequest& request,
73d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn      const CreateGoogleAttestedKeyCallback& callback) override;
746222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  void GetKeyInfo(const GetKeyInfoRequest& request,
756222defa52eb13c0d90673f642f2647f7753478bDarren Krahn                  const GetKeyInfoCallback& callback) override;
76cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  void GetEndorsementInfo(const GetEndorsementInfoRequest& request,
77cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn                          const GetEndorsementInfoCallback& callback) override;
78566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  void GetAttestationKeyInfo(
79566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      const GetAttestationKeyInfoRequest& request,
80566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      const GetAttestationKeyInfoCallback& callback) override;
812e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  void ActivateAttestationKey(
822e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      const ActivateAttestationKeyRequest& request,
832e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      const ActivateAttestationKeyCallback& callback) override;
8462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  void CreateCertifiableKey(
8562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      const CreateCertifiableKeyRequest& request,
8662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      const CreateCertifiableKeyCallback& callback) override;
87bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  void Decrypt(const DecryptRequest& request,
88bc0c74963418442991072b2c87baec839eec9c20Darren Krahn               const DecryptCallback& callback) override;
89ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  void Sign(const SignRequest& request, const SignCallback& callback) override;
90594849c7cf872d055575277b930f4f596bef1988Darren Krahn  void RegisterKeyWithChapsToken(
91594849c7cf872d055575277b930f4f596bef1988Darren Krahn      const RegisterKeyWithChapsTokenRequest& request,
92594849c7cf872d055575277b930f4f596bef1988Darren Krahn      const RegisterKeyWithChapsTokenCallback& callback) override;
93d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
94d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Mutators useful for testing.
95d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  void set_crypto_utility(CryptoUtility* crypto_utility) {
96d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    crypto_utility_ = crypto_utility;
97d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  }
9830a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn
9930a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn  void set_database(Database* database) {
10030a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn    database_ = database;
10130a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn  }
10230a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn
103d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  void set_http_transport(
104e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko      const std::shared_ptr<brillo::http::Transport>& transport) {
105d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    http_transport_ = transport;
106d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  }
107d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
108d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  void set_key_store(KeyStore* key_store) {
109d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    key_store_ = key_store;
110d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  }
111d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
112d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  void set_tpm_utility(TpmUtility* tpm_utility) {
113d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    tpm_utility_ = tpm_utility;
114d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  }
115d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
116d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // So tests don't need to duplicate URL decisions.
117d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  const std::string& attestation_ca_origin() {
118d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    return attestation_ca_origin_;
119d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  }
120d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
12130a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn private:
122d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  enum ACARequestType {
123d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    kEnroll,          // Enrolls a device, certifying an identity key.
124d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    kGetCertificate,  // Issues a certificate for a TPM-backed key.
125d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  };
126d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
127cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  // A relay callback which allows the use of weak pointer semantics for a reply
128cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  // to TaskRunner::PostTaskAndReply.
129cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  template<typename ReplyProtobufType>
130cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  void TaskRelayCallback(
131cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      const base::Callback<void(const ReplyProtobufType&)> callback,
132cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      const std::shared_ptr<ReplyProtobufType>& reply) {
133cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    callback.Run(*reply);
134cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  }
135cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn
136ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // A blocking implementation of CreateGoogleAttestedKey appropriate to run on
137ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // the worker thread.
138d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  void CreateGoogleAttestedKeyTask(
139b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn      const CreateGoogleAttestedKeyRequest& request,
140b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn      const std::shared_ptr<CreateGoogleAttestedKeyReply>& result);
141d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
142ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // A blocking implementation of GetKeyInfo.
1436222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  void GetKeyInfoTask(
1446222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      const GetKeyInfoRequest& request,
1456222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      const std::shared_ptr<GetKeyInfoReply>& result);
1466222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
147ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // A blocking implementation of GetEndorsementInfo.
148cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  void GetEndorsementInfoTask(
149cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      const GetEndorsementInfoRequest& request,
150cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      const std::shared_ptr<GetEndorsementInfoReply>& result);
1516222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
152ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // A blocking implementation of GetAttestationKeyInfo.
153566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  void GetAttestationKeyInfoTask(
154566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      const GetAttestationKeyInfoRequest& request,
155566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      const std::shared_ptr<GetAttestationKeyInfoReply>& result);
156566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn
157ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // A blocking implementation of ActivateAttestationKey.
1582e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  void ActivateAttestationKeyTask(
1592e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      const ActivateAttestationKeyRequest& request,
1602e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      const std::shared_ptr<ActivateAttestationKeyReply>& result);
1612e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
162ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // A blocking implementation of CreateCertifiableKey.
16362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  void CreateCertifiableKeyTask(
16462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      const CreateCertifiableKeyRequest& request,
16562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      const std::shared_ptr<CreateCertifiableKeyReply>& result);
16662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn
167ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // A blocking implementation of Decrypt.
168bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  void DecryptTask(const DecryptRequest& request,
169bc0c74963418442991072b2c87baec839eec9c20Darren Krahn                   const std::shared_ptr<DecryptReply>& result);
170bc0c74963418442991072b2c87baec839eec9c20Darren Krahn
171ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // A blocking implementation of Sign.
172ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  void SignTask(const SignRequest& request,
173ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn                const std::shared_ptr<SignReply>& result);
174ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn
175594849c7cf872d055575277b930f4f596bef1988Darren Krahn  // A synchronous implementation of RegisterKeyWithChapsToken.
176594849c7cf872d055575277b930f4f596bef1988Darren Krahn  void RegisterKeyWithChapsTokenTask(
177594849c7cf872d055575277b930f4f596bef1988Darren Krahn      const RegisterKeyWithChapsTokenRequest& request,
178594849c7cf872d055575277b930f4f596bef1988Darren Krahn      const std::shared_ptr<RegisterKeyWithChapsTokenReply>& result);
179594849c7cf872d055575277b930f4f596bef1988Darren Krahn
180d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Returns true iff all information required for enrollment with the Google
181d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Attestation CA is available.
182d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool IsPreparedForEnrollment();
183d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
184d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Returns true iff enrollment with the Google Attestation CA has been
185d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // completed.
186d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool IsEnrolled();
187d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
188d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Creates an enrollment request compatible with the Google Attestation CA.
189d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Returns true on success.
190d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool CreateEnrollRequest(std::string* enroll_request);
191d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
192d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Finishes enrollment given an |enroll_response| from the Google Attestation
193d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // CA. Returns true on success. On failure, returns false and sets
194d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // |server_error| to the error string from the CA.
195d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool FinishEnroll(const std::string& enroll_response,
196d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                    std::string* server_error);
197d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
198d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Creates a |certificate_request| compatible with the Google Attestation CA
19962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // for the given |key|, according to the given |profile|, |username| and
20062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // |origin|.
201d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool CreateCertificateRequest(const std::string& username,
20262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn                                const CertifiedKey& key,
203d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                                CertificateProfile profile,
204d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                                const std::string& origin,
205d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                                std::string* certificate_request,
206d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                                std::string* message_id);
207d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
208d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Finishes a certificate request by decoding the |certificate_response| to
20962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // recover the |certificate_chain| and storing it in association with the
21062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // |key| identified by |username| and |key_label|. Returns true on success. On
211d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // failure, returns false and sets |server_error| to the error string from the
212d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // CA.
213d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool FinishCertificateRequest(const std::string& certificate_response,
214d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                                const std::string& username,
215d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                                const std::string& key_label,
216d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                                const std::string& message_id,
21762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn                                CertifiedKey* key,
21862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn                                std::string* certificate_chain,
219d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                                std::string* server_error);
220d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
221d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Sends a |request_type| |request| to the Google Attestation CA and waits for
222d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // the |reply|. Returns true on success.
223d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool SendACARequestAndBlock(ACARequestType request_type,
224d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                              const std::string& request,
225d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                              std::string* reply);
226d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
22762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // Creates, certifies, and saves a new |key| for |username| with the given
22862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // |key_label|, |key_type|, and |key_usage|. Returns true on success.
229d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool CreateKey(const std::string& username,
230d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                 const std::string& key_label,
231d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                 KeyType key_type,
23262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn                 KeyUsage key_usage,
23362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn                 CertifiedKey* key);
234d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
235d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Finds the |key| associated with |username| and |key_label|. Returns false
236d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // if such a key does not exist.
237d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool FindKeyByLabel(const std::string& username,
238d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                      const std::string& key_label,
239d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                      CertifiedKey* key);
240d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
241d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Saves the |key| associated with |username| and |key_label|. Returns true on
242d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // success.
243d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool SaveKey(const std::string& username,
244d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn               const std::string& key_label,
245d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn               const CertifiedKey& key);
246d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
247d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Deletes the key associated with |username| and |key_label|.
248d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  void DeleteKey(const std::string& username,
249d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn                 const std::string& key_label);
250d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
251d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Adds named device-wide key to the attestation database.
252d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  bool AddDeviceKey(const std::string& key_label, const CertifiedKey& key);
253d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
254d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Removes a device-wide key from the attestation database.
255d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  void RemoveDeviceKey(const std::string& key_label);
256d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
257d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Creates a PEM certificate chain from the credential fields of a |key|.
258d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  std::string CreatePEMCertificateChain(const CertifiedKey& key);
259d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
260d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Creates a certificate in PEM format from a DER encoded X.509 certificate.
261d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  std::string CreatePEMCertificate(const std::string& certificate);
262d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
263d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Chooses a temporal index which will be used by the ACA to create a
264d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // certificate.  This decision factors in the currently signed-in |user| and
265d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // the |origin| of the certificate request.  The strategy is to find an index
266d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // which has not already been used by another user for the same origin.
267d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  int ChooseTemporalIndex(const std::string& user, const std::string& origin);
268d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
269d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Creates a Google Attestation CA URL for the given |request_type|.
270d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  std::string GetACAURL(ACARequestType request_type) const;
271d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
2726222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  // Creates a X.509/DER SubjectPublicKeyInfo for the given |key_type| and
2736222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  // |public_key|. On success returns true and provides |public_key_info|.
2746222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  bool GetSubjectPublicKeyInfo(KeyType key_type,
2756222defa52eb13c0d90673f642f2647f7753478bDarren Krahn                               const std::string& public_key,
2766222defa52eb13c0d90673f642f2647f7753478bDarren Krahn                               std::string* public_key_info) const;
2776222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
278d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  base::WeakPtr<AttestationService> GetWeakPtr();
279d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
280d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
281d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  const std::string attestation_ca_origin_;
282d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
283d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Other than initialization and destruction, these are used only by the
284d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // worker thread.
28559d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  CryptoUtility* crypto_utility_{nullptr};
28659d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  Database* database_{nullptr};
287e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko  std::shared_ptr<brillo::http::Transport> http_transport_;
28859d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  KeyStore* key_store_{nullptr};
28959d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  TpmUtility* tpm_utility_{nullptr};
29059d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn
29159d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  // Default implementations for the above interfaces. These will be setup
29259d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  // during Initialize() if the corresponding interface has not been set with a
29359d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  // mutator.
29459d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  std::unique_ptr<CryptoUtilityImpl> default_crypto_utility_;
29559d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  std::unique_ptr<DatabaseImpl> default_database_;
29659d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  std::unique_ptr<Pkcs11KeyStore> default_key_store_;
29759d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  std::unique_ptr<chaps::TokenManagerClient> pkcs11_token_manager_;
29859d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn  std::unique_ptr<TpmUtilityV1> default_tpm_utility_;
299d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
300d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // All work is done in the background. This serves to serialize requests and
301d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // allow synchronous implementation of complex methods. This is intentionally
302d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // declared after the thread-owned members.
303d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  std::unique_ptr<base::Thread> worker_thread_;
304d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn
305d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  // Declared last so any weak pointers are destroyed first.
306d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  base::WeakPtrFactory<AttestationService> weak_factory_;
30730a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn
30830a5bba00647d29e324111005deb76a0466f8c6bDarren Krahn  DISALLOW_COPY_AND_ASSIGN(AttestationService);
3096bead48129845a2bc0d6ff347f3d7e232004d59Nam T. Nguyen};
3106bead48129845a2bc0d6ff347f3d7e232004d59Nam T. Nguyen
311ab0cddda9971f97781fc9f6cbc76095ba7542abfAlex Vakulenko}  // namespace attestation
3126bead48129845a2bc0d6ff347f3d7e232004d59Nam T. Nguyen
313ab0cddda9971f97781fc9f6cbc76095ba7542abfAlex Vakulenko#endif  // ATTESTATION_SERVER_ATTESTATION_SERVICE_H_
314