/* Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * openUBMC is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

#ifndef __SPDM_COMMAND_IMPL_H__
#define __SPDM_COMMAND_IMPL_H__

#include "common.h"

extern "C" {
#include "hal/base.h"
#include "internal/libspdm_common_lib.h"
#include "internal/libspdm_requester_lib.h"
}

// ===================================================== 重试配置 =====================================================
#define NOT_READY_MAX_RETRY_CNT    3           // 最多主动重试3次
#define NOT_READY_TOTAL_TIMEOUT_MS (30 * 1000) // 最多等待30秒

// =================================================== SPDM公共函数 ===================================================
bool     CheckContext(void* spdm_context);
size_t   GetContextSize(void);
size_t   GetContextSizeWithoutSecuredContext(void);
uint32_t InitContext(void* spdm_context);

void     RegisterDeviceIoFunc(void* spdm_context, libspdm_device_send_message_func send_message,
                              libspdm_device_receive_message_func receive_message);
void     RegisterTransportLayerFunc(void* spdm_context, uint32_t max_spdm_msg_size, uint32_t transport_header_size,
                                    uint32_t                              transport_tail_size,
                                    libspdm_transport_encode_message_func transport_encode_message,
                                    libspdm_transport_decode_message_func transport_decode_message);
void     RegisterDeviceBufferFunc(void* spdm_context, uint32_t sender_buffer_size, uint32_t receiver_buffer_size,
                                  libspdm_device_acquire_sender_buffer_func   acquire_sender_buffer,
                                  libspdm_device_release_sender_buffer_func   release_sender_buffer,
                                  libspdm_device_acquire_receiver_buffer_func acquire_receiver_buffer,
                                  libspdm_device_release_receiver_buffer_func release_receiver_buffer);
uint32_t SpdmSetData(void* spdm_context, libspdm_data_type_t data_type, const libspdm_data_parameter_t* parameter,
                     const void* data, size_t data_size);
uint32_t SpdmGetData(void* spdm_context, libspdm_data_type_t data_type, const libspdm_data_parameter_t* parameter,
                     void* data, size_t* data_size);
void     ZeroMem(void* buffer, size_t length);
size_t   GetRequiredScratchBufferSize(void* spdm_context);
void     SetScratchBuffer(void* spdm_context, void* scratch_buffer, size_t scratch_buffer_size);

size_t GetHashSize(uint32_t base_hash_algo);
// =================================================== SPDM请求端函数
// ===================================================
uint32_t InitSpdmConnection(void* spdm_context, bool get_version_only);
uint32_t GetDigest(void* spdm_context, const uint32_t* session_id, uint8_t* slot_mask, void* total_digest_buffer);
uint32_t GetCertificate(void* spdm_context, const uint32_t* session_id, uint8_t slot_id, size_t* cert_chain_size,
                        void* cert_chain);
uint32_t ChallengeAuth(void* spdm_context, void* reserved, uint8_t slot_id, uint8_t measurement_hash_type,
                       void* measurement_hash, uint8_t* slot_mask);
uint32_t GetMeasurement(void* spdm_context, const uint32_t* session_id, uint8_t request_attribute,
                        uint8_t measurement_operation, uint8_t slot_id, uint8_t* content_changed,
                        uint8_t* number_of_blocks, uint32_t* measurement_record_length, void* measurement_record);
uint32_t GetMeasurementEx(void* spdm_context, const uint32_t* session_id, uint8_t request_attribute,
                          uint8_t measurement_operation, uint8_t slot_id, uint8_t* content_changed,
                          uint8_t* number_of_blocks, uint32_t* measurement_record_length, void* measurement_record,
                          const void* requester_nonce_in, void* requester_nonce, void* responder_nonce,
                          void* opaque_data, size_t* opaque_data_size);

#endif // __SPDM_COMMAND_IMPL_H__