// Copyright 2018 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 TRUNKS_TPM_PINWEAVER_H_
#define TRUNKS_TPM_PINWEAVER_H_

extern "C" {
#define __packed  __attribute((packed))
#define __aligned(x) __attribute((aligned (x)))
#include "trunks/cr50_headers/pinweaver_types.h"
}

#include <map>
#include <string>
#include <vector>

#include <base/command_line.h>
#include <brillo/brillo_export.h>
#include <brillo/secure_blob.h>

#include "trunks/error_codes.h"
#include "trunks/pinweaver.pb.h"

namespace trunks {

BRILLO_EXPORT TPM_RC Serialize_pw_ping_t(uint8_t request_version,
                                         std::string* buffer);

BRILLO_EXPORT TPM_RC Serialize_pw_reset_tree_t(uint8_t protocol_version,
                                               uint8_t bits_per_level,
                                               uint8_t height,
                                               std::string* buffer);

BRILLO_EXPORT TPM_RC
Serialize_pw_insert_leaf_t(uint8_t protocol_version,
                           uint64_t label,
                           const std::string& h_aux,
                           const brillo::SecureBlob& le_secret,
                           const brillo::SecureBlob& he_secret,
                           const brillo::SecureBlob& reset_secret,
                           const std::map<uint32_t, uint32_t>& delay_schedule,
                           const ValidPcrCriteria& valid_pcr_criteria,
                           std::string* buffer);

BRILLO_EXPORT TPM_RC Serialize_pw_remove_leaf_t(uint8_t protocol_version,
                                                uint64_t label,
                                                const std::string& h_aux,
                                                const std::string& mac,
                                                std::string* buffer);

BRILLO_EXPORT TPM_RC
Serialize_pw_try_auth_t(uint8_t protocol_version,
                        const brillo::SecureBlob& le_secret,
                        const std::string& h_aux,
                        const std::string& cred_metadata,
                        std::string* buffer);

BRILLO_EXPORT TPM_RC
Serialize_pw_reset_auth_t(uint8_t protocol_version,
                          const brillo::SecureBlob& reset_secret,
                          const std::string& h_aux,
                          const std::string& cred_metadata,
                          std::string* buffer);

BRILLO_EXPORT TPM_RC Serialize_pw_get_log_t(uint8_t protocol_version,
                                            const std::string& root,
                                            std::string* buffer);

BRILLO_EXPORT TPM_RC Serialize_pw_log_replay_t(uint8_t protocol_version,
                                               const std::string& log_root,
                                               const std::string& h_aux,
                                               const std::string& cred_metadata,
                                               std::string* buffer);

// If TPM_RC_SUCCESS is returned, |result_code| and |root_hash| will be valid.
// The other fields generally will not be valid unless |result_code| is zero.
// Try auth has an exception for PW_ERR_LOWENT_AUTH_FAILED and
// PW_ERR_RATE_LIMIT_REACHED that have additional valid fields. Rather than
// using the return codes to determine which fields are valid, it is sufficient
// to determine a field is valid by checking that it is not empty.
BRILLO_EXPORT TPM_RC Parse_pw_response_header_t(const std::string& buffer,
                                                uint32_t* result_code,
                                                std::string* root_hash,
                                                uint16_t* data_length);

BRILLO_EXPORT TPM_RC Parse_pw_short_message(const std::string& buffer,
                                            uint32_t* result_code,
                                            std::string* root_hash);

BRILLO_EXPORT TPM_RC Parse_pw_pong_t(const std::string& buffer,
                                     uint8_t* protocol_version);

BRILLO_EXPORT TPM_RC Parse_pw_insert_leaf_t(const std::string& buffer,
                                            uint32_t* result_code,
                                            std::string* root_hash,
                                            std::string* cred_metadata,
                                            std::string* mac);

BRILLO_EXPORT TPM_RC Parse_pw_try_auth_t(const std::string& buffer,
                                         uint32_t* result_code,
                                         std::string* root_hash,
                                         uint32_t* seconds_to_wait,
                                         brillo::SecureBlob* he_secret,
                                         brillo::SecureBlob* reset_secret,
                                         std::string* cred_metadata_out,
                                         std::string* mac_out);

BRILLO_EXPORT TPM_RC Parse_pw_reset_auth_t(const std::string& buffer,
                                           uint32_t* result_code,
                                           std::string* root_hash,
                                           brillo::SecureBlob* he_secret,
                                           std::string* cred_metadata_out,
                                           std::string* mac_out);

BRILLO_EXPORT TPM_RC
Parse_pw_get_log_t(const std::string& buffer,
                   uint32_t* result_code,
                   std::string* root_hash,
                   std::vector<trunks::PinWeaverLogEntry>* log);

BRILLO_EXPORT TPM_RC Parse_pw_log_replay_t(const std::string& buffer,
                                           uint32_t* result_code,
                                           std::string* root_hash,
                                           std::string* cred_metadata_out,
                                           std::string* mac_out);

}  // namespace trunks

#endif  // TRUNKS_TPM_PINWEAVER_H_
