/* Copyright (c) 2010 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.
 *
 * Tests for checking firmware rollback-prevention logic.
 */

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

#include "cryptolib.h"
#include "file_keys.h"
#include "firmware_image.h"
#include "utility.h"
#include "rollback_index.h"
#include "test_common.h"

const char* kRootKeyPublicFile = "testkeys/key_rsa8192.keyb";
uint8_t kValidFirmwareData[1] = { 'F' };
uint8_t kCorruptFirmwareData[1] = { 'X' };

/* Tests that check for correctness of the VerifyFirmwareDriver_f() logic
 * and rollback prevention. */
void VerifyFirmwareDriverTest(void) {
  uint8_t* verification_blobA = NULL;
  uint8_t* verification_blobB = NULL;
  uint64_t len;
  uint8_t* root_key_pub = BufferFromFile(kRootKeyPublicFile, &len);

  /* Initialize rollback index state. */
  g_firmware_key_version = 1;
  g_firmware_version = 1;

  verification_blobA = GenerateRollbackTestVerificationBlob(1, 1);
  verification_blobB = GenerateRollbackTestVerificationBlob(1, 1);

  TEST_EQ(VerifyFirmwareDriver_f(root_key_pub,
                                 verification_blobA,
                                 kValidFirmwareData,
                                 verification_blobB,
                                 kValidFirmwareData),
          BOOT_FIRMWARE_A_CONTINUE,
          "Firmware A (Valid with current version), "
          "Firmware B (Valid with current version)");
  TEST_EQ(VerifyFirmwareDriver_f(root_key_pub,
                                 verification_blobA,
                                 kCorruptFirmwareData,
                                 verification_blobB,
                                 kValidFirmwareData),
          BOOT_FIRMWARE_B_CONTINUE,
          "Firmware A (Corrupt with current version), "
          "Firmware B (Valid with current version)");
  TEST_EQ(VerifyFirmwareDriver_f(root_key_pub,
                                 verification_blobA,
                                 kValidFirmwareData,
                                 verification_blobB,
                                 kCorruptFirmwareData),
          BOOT_FIRMWARE_A_CONTINUE,
          "Firmware A (Valid with current version), "
          "Firmware B (Corrupt with current version)");
  TEST_EQ(VerifyFirmwareDriver_f(root_key_pub,
                                 verification_blobA,
                                 kCorruptFirmwareData,
                                 verification_blobB,
                                 kCorruptFirmwareData),
          BOOT_FIRMWARE_RECOVERY_CONTINUE,
          "Firmware A (Corrupt with current version), "
          "Firmware B (Corrupt with current version");
  g_firmware_key_version = 2;
  g_firmware_version = 2;
  TEST_EQ(VerifyFirmwareDriver_f(root_key_pub,
                                 verification_blobA,
                                 kValidFirmwareData,
                                 verification_blobB,
                                 kValidFirmwareData),
          BOOT_FIRMWARE_RECOVERY_CONTINUE,
          "Firmware A (Valid with old version), "
          "Old Firmware B (Valid with old version)");

  Free(root_key_pub);
  Free(verification_blobA);
  Free(verification_blobB);
}

int main(int argc, char* argv[]) {
  int error_code = 0;
  VerifyFirmwareDriverTest();
  if (!gTestSuccess)
    error_code = 255;
  return error_code;
}
