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