blob: bf712085867b9eb65eb93b12f59fc71d9618b620 [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ATTESTATION_SERVER_ATTESTATION_FLOW_H_
#define ATTESTATION_SERVER_ATTESTATION_FLOW_H_
#include <string>
#include <utility>
#include <attestation/proto_bindings/interface.pb.h>
#include <base/callback.h>
#include <base/optional.h>
#include "attestation/common/attestation_interface.h"
namespace attestation {
// Indicates what is the next action in the entire attestation flow, either
// for enrollment or for certificate. See the comments inlined.
enum class AttestationFlowAction {
// Unknown action.
kUnknown,
// Inficates what some error occurs during the attestation flow so the action
// is to abort the transactions.
kAbort,
// The request is created and the next action is to process the request to the
// corresponding CA, e.g., sending the result request to the corresponding CA
// server.
kProcessRequest,
// The request should be enqueued and processed later.
kEnqueue,
// The request is done, no further actions is needed.
kNoop,
};
// An adaptor class to provide a unified interpretation result of
// |EnrollRequest| and |GetCertificateRequest|. This class provides the
// following families of operations:
// 1. Constructors that build |AttestationFlowData| based on |EnrollRequest| or
// |GetCertificateRequest|, and their accompanying callbacks.
// 2. Derived information from the data input.
// 3. Accessors of the current status of the attestation flow.
// 4. Operations that call callbacks.
class AttestationFlowData {
using EnrollCallback = AttestationInterface::EnrollCallback;
using GetCertificateCallback = AttestationInterface::GetCertificateCallback;
public:
AttestationFlowData() = delete;
AttestationFlowData(const EnrollRequest& request,
const EnrollCallback& callback);
AttestationFlowData(const GetCertificateRequest& request,
const GetCertificateCallback& callback);
// Derived information from the static data.
ACAType aca_type() const;
bool shall_enroll() const;
bool shall_get_certificate() const;
bool forced_enrollment() const;
bool forced_get_certificate() const;
const GetCertificateRequest& get_certificate_request() const;
std::string username() const;
std::string key_label() const;
// Statuses of this attestation flow.
AttestationFlowAction action() const { return action_; }
void set_action(AttestationFlowAction action) { action_ = action; }
AttestationStatus status() const { return status_; }
void set_status(AttestationStatus status) { status_ = status; }
std::string result_request() const { return result_request_; }
void emplace_result_request(std::string&& result_request) {
result_request_ = std::move(result_request);
}
std::string result_response() const { return result_response_; }
void set_result_response(const std::string& result_response) {
result_response_ = result_response;
}
const std::string& certificate() const { return certificate_; }
void set_public_key(std::string public_key) {
public_key_ = std::move(public_key);
}
void set_certificate(std::string certificate) {
certificate_ = std::move(certificate);
}
// Operations on callbacks.
void ReturnStatus();
void ReturnCertificate();
private:
const base::Optional<EnrollRequest> enroll_request_;
const base::Optional<EnrollCallback> enroll_callback_;
const base::Optional<GetCertificateRequest> get_certificate_request_;
const base::Optional<GetCertificateCallback> get_certificate_callback_;
AttestationFlowAction action_{AttestationFlowAction::kUnknown};
AttestationStatus status_{STATUS_SUCCESS};
std::string result_request_;
std::string result_response_;
std::string public_key_;
std::string certificate_;
};
} // namespace attestation
#endif // ATTESTATION_SERVER_ATTESTATION_FLOW_H_