/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 2015  Free Software Foundation, Inc.
 *
 *  GRUB is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  GRUB is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef GRUB_EFI_TPM_HEADER
#define GRUB_EFI_TPM_HEADER 1

#define EFI_TPM_GUID {0xf541796d, 0xa62e, 0x4954, {0xa7, 0x75, 0x95, 0x84, 0xf6, 0x1b, 0x9c, 0xdd }};
#define EFI_TPM2_GUID {0x607f766c, 0x7455, 0x42be, {0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f }};

typedef struct {
  grub_efi_uint8_t Major;
  grub_efi_uint8_t Minor;
  grub_efi_uint8_t RevMajor;
  grub_efi_uint8_t RevMinor;
} TCG_VERSION;

typedef struct _TCG_EFI_BOOT_SERVICE_CAPABILITY {
  grub_efi_uint8_t          Size;                /// Size of this structure.
  TCG_VERSION    StructureVersion;
  TCG_VERSION    ProtocolSpecVersion;
  grub_efi_uint8_t          HashAlgorithmBitmap; /// Hash algorithms .
  char        TPMPresentFlag;      /// 00h = TPM not present.
  char        TPMDeactivatedFlag;  /// 01h = TPM currently deactivated.
} TCG_EFI_BOOT_SERVICE_CAPABILITY;

typedef struct {
  grub_efi_uint32_t PCRIndex;
  grub_efi_uint32_t EventType;
  grub_efi_uint8_t digest[20];
  grub_efi_uint32_t EventSize;
  grub_efi_uint8_t  Event[1];
} TCG_PCR_EVENT;

struct grub_efi_tpm_protocol
{
  grub_efi_status_t (*status_check) (struct grub_efi_tpm_protocol *this,
                                    TCG_EFI_BOOT_SERVICE_CAPABILITY *ProtocolCapability,
                                    grub_efi_uint32_t *TCGFeatureFlags,
                                    grub_efi_physical_address_t *EventLogLocation,
                                    grub_efi_physical_address_t *EventLogLastEntry);
  grub_efi_status_t (*hash_all) (struct grub_efi_tpm_protocol *this,
                                grub_efi_uint8_t *HashData,
                                grub_efi_uint64_t HashLen,
                                grub_efi_uint32_t AlgorithmId,
                                grub_efi_uint64_t *HashedDataLen,
                                grub_efi_uint8_t **HashedDataResult);
  grub_efi_status_t (*log_event) (struct grub_efi_tpm_protocol *this,
                                 TCG_PCR_EVENT *TCGLogData,
                                 grub_efi_uint32_t *EventNumber,
                                 grub_efi_uint32_t Flags);
  grub_efi_status_t (*pass_through_to_tpm) (struct grub_efi_tpm_protocol *this,
                                           grub_efi_uint32_t TpmInputParameterBlockSize,
                                           grub_efi_uint8_t *TpmInputParameterBlock,
                                           grub_efi_uint32_t TpmOutputParameterBlockSize,
                                           grub_efi_uint8_t *TpmOutputParameterBlock);
  grub_efi_status_t (*log_extend_event) (struct grub_efi_tpm_protocol *this,
                                        grub_efi_physical_address_t HashData,
                                        grub_efi_uint64_t HashDataLen,
                                        grub_efi_uint32_t AlgorithmId,
                                        TCG_PCR_EVENT *TCGLogData,
                                        grub_efi_uint32_t *EventNumber,
                                        grub_efi_physical_address_t *EventLogLastEntry);
};

typedef struct grub_efi_tpm_protocol grub_efi_tpm_protocol_t;

typedef grub_efi_uint32_t EFI_TCG2_EVENT_LOG_BITMAP;
typedef grub_efi_uint32_t EFI_TCG2_EVENT_LOG_FORMAT;
typedef grub_efi_uint32_t EFI_TCG2_EVENT_ALGORITHM_BITMAP;

typedef struct tdEFI_TCG2_VERSION {
  grub_efi_uint8_t Major;
  grub_efi_uint8_t Minor;
} GRUB_PACKED EFI_TCG2_VERSION;

typedef struct tdEFI_TCG2_BOOT_SERVICE_CAPABILITY {
  grub_efi_uint8_t Size;
  EFI_TCG2_VERSION StructureVersion;
  EFI_TCG2_VERSION ProtocolVersion;
  EFI_TCG2_EVENT_ALGORITHM_BITMAP HashAlgorithmBitmap;
  EFI_TCG2_EVENT_LOG_BITMAP SupportedEventLogs;
  grub_efi_boolean_t TPMPresentFlag;
  grub_efi_uint16_t MaxCommandSize;
  grub_efi_uint16_t MaxResponseSize;
  grub_efi_uint32_t ManufacturerID;
  grub_efi_uint32_t NumberOfPcrBanks;
  EFI_TCG2_EVENT_ALGORITHM_BITMAP ActivePcrBanks;
} EFI_TCG2_BOOT_SERVICE_CAPABILITY;

typedef grub_efi_uint32_t TCG_PCRINDEX;
typedef grub_efi_uint32_t TCG_EVENTTYPE;

typedef struct tdEFI_TCG2_EVENT_HEADER {
  grub_efi_uint32_t HeaderSize;
  grub_efi_uint16_t HeaderVersion;
  TCG_PCRINDEX PCRIndex;
  TCG_EVENTTYPE EventType;
} GRUB_PACKED EFI_TCG2_EVENT_HEADER;

typedef struct tdEFI_TCG2_EVENT {
  grub_efi_uint32_t Size;
  EFI_TCG2_EVENT_HEADER Header;
  grub_efi_uint8_t Event[1];
} GRUB_PACKED EFI_TCG2_EVENT;

struct grub_efi_tpm2_protocol
{
  grub_efi_status_t (*get_capability) (struct grub_efi_tpm2_protocol *this,
                                      EFI_TCG2_BOOT_SERVICE_CAPABILITY *ProtocolCapability);
  grub_efi_status_t (*get_event_log) (struct grub_efi_tpm2_protocol *this,
                                     EFI_TCG2_EVENT_LOG_FORMAT EventLogFormat,
                                     grub_efi_physical_address_t *EventLogLocation,
                                     grub_efi_physical_address_t *EventLogLastEntry,
                                     grub_efi_boolean_t *EventLogTruncated);
  grub_efi_status_t (*hash_log_extend_event) (struct grub_efi_tpm2_protocol *this,
                                             grub_efi_uint64_t Flags,
                                             grub_efi_physical_address_t *DataToHash,
                                             grub_efi_uint64_t DataToHashLen,
                                             EFI_TCG2_EVENT *EfiTcgEvent);
  grub_efi_status_t (*submit_command) (struct grub_efi_tpm2_protocol *this,
                                      grub_efi_uint32_t InputParameterBlockSize,
                                      grub_efi_uint8_t *InputParameterBlock,
                                      grub_efi_uint32_t OutputParameterBlockSize,
                                      grub_efi_uint8_t *OutputParameterBlock);
  grub_efi_status_t (*get_active_pcr_blanks) (struct grub_efi_tpm2_protocol *this,
                                             grub_efi_uint32_t *ActivePcrBanks);
  grub_efi_status_t (*set_active_pcr_banks) (struct grub_efi_tpm2_protocol *this,
                                            grub_efi_uint32_t ActivePcrBanks);
  grub_efi_status_t (*get_result_of_set_active_pcr_banks) (struct grub_efi_tpm2_protocol *this,
                                                          grub_efi_uint32_t *OperationPresent,
                                                          grub_efi_uint32_t *Response);
};

typedef struct grub_efi_tpm2_protocol grub_efi_tpm2_protocol_t;

#define TCG_ALG_SHA 0x00000004

#endif
