// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#include "sw/device/lib/aes.h"

#include "sw/device/lib/arch/device.h"
#include "sw/device/lib/common.h"
#include "sw/device/lib/uart.h"

// The following plaintext, key and ciphertext are extracted from Appendix C of
// the Advanced Encryption Standard (AES) FIPS Publication 197 available at
// https://www.nist.gov/publications/advanced-encryption-standard-aes

static const uint8_t plain_text_1[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55,
                                         0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
                                         0xcc, 0xdd, 0xee, 0xff};

static const uint8_t key_32_1[32] = {
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
    0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};

static const uint8_t cipher_text_gold_32_1[16] = {
    0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
    0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89};

int main(int argc, char **argv) {
  bool has_error = false;

  // Wait for AES unit being idle
  while (!aes_idle()) {
  }

  uint8_t buffer[16];

  uart_init(kUartBaudrate);
  uart_send_str("Running AES test\r\n");

  // Setup AES config
  aes_cfg_t aes_cfg = {
      .mode = kAesEcb,
      .key_len = kAes256,
      .manual_operation = false,
  };

  aes_key_put(key_32_1, aes_cfg.key_len);

  // Encode
  aes_cfg.operation = kAesEnc;
  aes_init(aes_cfg);
  aes_data_put_wait(plain_text_1);
  aes_data_get_wait(buffer);

  // Check against golden cipher text
  for (int i = 0; i < 16; i++) {
    if (cipher_text_gold_32_1[i] != buffer[i]) {
      has_error = true;
    }
  }

  // Decode
  aes_cfg.operation = kAesDec;
  aes_init(aes_cfg);
  aes_data_put_wait(buffer);
  aes_data_get_wait(buffer);

  // Check against input plain text
  for (int i = 0; i < 16; i++) {
    if (plain_text_1[i] != buffer[i]) {
      has_error = true;
    }
  }

  // Clear
  aes_clear();

  if (has_error) {
    uart_send_str("FAIL!\r\n");
  } else {
    uart_send_str("PASS!\r\n");
  }

  return 0;
}
