/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, embodiment or
 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 *
 * SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause-Patent
 *
 * This file is dual-licensed under Apache 2.0 and BSD-2-Clause-Patent.
 * You may choose to use this file under the terms of either:
 *  (a) the Apache License, Version 2.0, or
 *  (b) the BSD 2-Clause Patent License.
 *
 * Unless you expressly elect the BSD-2-Clause-Patent terms, the Apache-2.0
 * license terms apply by default.
 */

#ifndef __GBL_EFI_AVB_PROTOCOL_H__
#define __GBL_EFI_AVB_PROTOCOL_H__

#include <gbl_efi_common.h>

static const uint64_t GBL_EFI_AVB_PROTOCOL_REVISION = GBL_PROTOCOL_REVISION(1, 0);

typedef uint64_t GblEfiAvbDeviceStatus;

// Indicates device is unlocked.
static const GblEfiAvbDeviceStatus GBL_EFI_AVB_DEVICE_STATUS_UNLOCKED = 0x1 << 0;
// Indicates a dm-verity error has occurred.
static const GblEfiAvbDeviceStatus GBL_EFI_AVB_DEVICE_STATUS_DM_VERITY_FAILED = 0x1 << 1;
// Indicates device is unlocked for critical operations.
static const GblEfiAvbDeviceStatus GBL_EFI_AVB_DEVICE_STATUS_UNLOCKED_CRITICAL = 0x1 << 2;
// Indicates the device bootloader can be unlocked.
static const GblEfiAvbDeviceStatus GBL_EFI_AVB_DEVICE_STATUS_UNLOCKABLE = 0x1 << 3;

// Os boot state color flags.
//
// https://source.android.com/docs/security/features/verifiedboot/boot-flow#communicating-verified-boot-state-to-users
typedef uint64_t GblEfiAvbBootColorFlags;
static const GblEfiAvbBootColorFlags GBL_EFI_AVB_BOOT_COLOR_RED = 0x1 << 0;
static const GblEfiAvbBootColorFlags GBL_EFI_AVB_BOOT_COLOR_ORANGE = 0x1 << 1;
static const GblEfiAvbBootColorFlags GBL_EFI_AVB_BOOT_COLOR_YELLOW = 0x1 << 2;
static const GblEfiAvbBootColorFlags GBL_EFI_AVB_BOOT_COLOR_GREEN = 0x1 << 3;
static const GblEfiAvbBootColorFlags GBL_EFI_AVB_BOOT_COLOR_RED_EIO = 0x1 << 4;

// Vbmeta key validation status.
//
// https://source.android.com/docs/security/features/verifiedboot/boot-flow#locked-devices-with-custom-root-of-trust
EFI_ENUM(GblEfiAvbKeyValidationStatus, uint32_t, GBL_EFI_AVB_KEY_VALIDATION_STATUS_INVALID,
         GBL_EFI_AVB_KEY_VALIDATION_STATUS_VALID_CUSTOM_KEY,
         GBL_EFI_AVB_KEY_VALIDATION_STATUS_VALID);

typedef uint64_t GblEfiAvbPartitionFlags;
static const GblEfiAvbPartitionFlags GBL_EFI_AVB_PARTITION_FLAG_VERIFY = 0x1 << 0;
static const GblEfiAvbPartitionFlags GBL_EFI_AVB_PARTITION_FLAG_VERIFY_IF_EXISTS = 0x1 << 1;
static const GblEfiAvbPartitionFlags GBL_EFI_AVB_PARTITION_FLAG_FLASH_CRITICAL = 0x1 << 2;
static const GblEfiAvbPartitionFlags GBL_EFI_AVB_PARTITION_FLAG_FDR = 0x1 << 3;

EFI_ENUM(GblEfiAvbLockType, uint8_t, GBL_EFI_AVB_LOCK_TYPE_DEVICE, GBL_EFI_AVB_LOCK_TYPE_CRITICAL);

EFI_ENUM(GblEfiAvbLockState, uint8_t, GBL_EFI_AVB_LOCK_STATE_UNLOCKED,
         GBL_EFI_AVB_LOCK_STATE_LOCKED);

typedef struct {
  // On input - `base_name` buffer size
  // On output - actual `base_name` length
  size_t base_name_len;
  char* base_name;
  GblEfiAvbPartitionFlags flags;
} GblEfiAvbPartitionAttributes;

typedef struct {
  // UTF-8, null terminated
  const char* base_name;
  size_t data_size;
  const uint8_t* data;
} GblEfiAvbLoadedPartition;

typedef struct {
  // UTF-8, null terminated
  const char* base_partition_name;
  // UTF-8, null terminated
  const char* key;
  // Excluding null terminator
  size_t value_size;
  const uint8_t* value;
} GblEfiAvbProperty;

typedef struct {
  GblEfiAvbBootColorFlags color_flags;
  // Pointer to nul-terminated ASCII hex digest calculated by libavb. May be
  // null in case of verification failed (RED boot state color).
  const char* digest;
  size_t num_partitions;
  const GblEfiAvbLoadedPartition* partitions;
  size_t num_properties;
  const GblEfiAvbProperty* properties;
  uint64_t reserved[8];
} GblEfiAvbVerificationResult;

typedef struct GblEfiAvbProtocol {
  uint64_t revision;

  efi_status_t (*read_partition_attributes)(struct GblEfiAvbProtocol* self,
                                         /* in-out */ size_t* num_partitions,
                                         /* in-out */ GblEfiAvbPartitionAttributes* partitions);

  efi_status_t (*read_device_status)(struct GblEfiAvbProtocol* self,
                                  /* out */ GblEfiAvbDeviceStatus* status_flags);

  efi_status_t (*validate_vbmeta_public_key)(
      struct GblEfiAvbProtocol* self,
      /* in */ size_t public_key_length,
      /* in */ const uint8_t* public_key_data,
      /* in */ size_t public_key_metadata_length,
      /* in */ const uint8_t* public_key_metadata,
      /* out */ GblEfiAvbKeyValidationStatus* validation_status);

  efi_status_t (*read_rollback_index)(struct GblEfiAvbProtocol* self,
                                   /* in */ size_t index_location,
                                   /* out */ uint64_t* rollback_index);

  efi_status_t (*write_rollback_index)(struct GblEfiAvbProtocol* self,
                                    /* in */ size_t index_location,
                                    /* in */ uint64_t rollback_index);

  efi_status_t (*read_persistent_value)(struct GblEfiAvbProtocol* self,
                                     /* in */ const char* name,
                                     /* in-out */ size_t* value_size,
                                     /* out */ uint8_t* value);

  efi_status_t (*write_persistent_value)(struct GblEfiAvbProtocol* self,
                                      /* in */ const char* name,
                                      /* in */ size_t value_size,
                                      /* in */ const uint8_t* value);

  efi_status_t (*handle_verification_result)(struct GblEfiAvbProtocol* self,
                                          /* in */ const GblEfiAvbVerificationResult* result);

  efi_status_t (*write_lock_state)(struct GblEfiAvbProtocol* self,
                                /* in */ GblEfiAvbLockType type,
                                /* in */ GblEfiAvbLockState state);

  efi_status_t (*factory_data_reset)(struct GblEfiAvbProtocol* self);
} GblEfiAvbProtocol;

#endif  //__GBL_EFI_AVB_PROTOCOL_H__
