/** @file
  Application for EdDSA Primitives Validation.

Copyright (c) 2026, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "TestBaseCryptLib.h"

#define ED448_KEY_SIZE  57
#define ED448_SIG_SIZE  114

//
// Ed448 Raw Private Key (57 bytes) extracted from DER format
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  mEd448TestPrivateKey[ED448_KEY_SIZE] = {
  0x1d, 0x72, 0xe7, 0x9b, 0x46, 0x5f, 0xcb, 0xcc, 0x24, 0x07, 0x2e, 0x20,
  0x92, 0xec, 0xb6, 0xdd, 0x11, 0x68, 0x14, 0x0d, 0x84, 0x1f, 0xf9, 0x8f,
  0x13, 0xe5, 0x73, 0x78, 0xb0, 0x42, 0xb7, 0xe5, 0x90, 0x45, 0xcc, 0x15,
  0x07, 0x41, 0x66, 0x46, 0x6a, 0xef, 0xc9, 0x9e, 0x2d, 0xaa, 0x3f, 0x28,
  0xfd, 0xac, 0x7f, 0x23, 0xe2, 0x15, 0x60, 0xaf, 0x7b
};

//
// Ed448 Raw Public Key (57 bytes) - derived from the private key above
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  mEd448TestPublicKey[ED448_KEY_SIZE] = {
  0x47, 0xba, 0x8f, 0x77, 0x45, 0x59, 0xee, 0x91, 0x90, 0x52, 0x96, 0x9f,
  0x59, 0xcd, 0xfa, 0xd5, 0x82, 0x00, 0xc1, 0x92, 0x5c, 0x90, 0x58, 0x79,
  0xaa, 0xbd, 0x74, 0xd2, 0x2c, 0x34, 0xe8, 0x1e, 0xce, 0xbb, 0x59, 0x4d,
  0xa9, 0x58, 0xaa, 0x61, 0x86, 0x1c, 0xa3, 0xd6, 0x32, 0x64, 0xda, 0x67,
  0xf7, 0x8b, 0x0e, 0xfa, 0x09, 0xa7, 0x22, 0xfb, 0x80
};

//
// Ed448 X509 Certificate (DER format) matching the test keys
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  mEd448TestCert[] = {
  0x30, 0x82, 0x02, 0x3a, 0x30, 0x82, 0x01, 0xba, 0xa0, 0x03, 0x02, 0x01,
  0x02, 0x02, 0x14, 0x3b, 0x44, 0xcc, 0x80, 0x92, 0xfe, 0xa8, 0x1a, 0x35,
  0x97, 0x53, 0x71, 0x2b, 0xe0, 0xf8, 0xed, 0xb5, 0x44, 0x1c, 0x7f, 0x30,
  0x05, 0x06, 0x03, 0x2b, 0x65, 0x71, 0x30, 0x6d, 0x31, 0x0b, 0x30, 0x09,
  0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x12, 0x30,
  0x10, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x09, 0x54, 0x65, 0x73, 0x74,
  0x53, 0x74, 0x61, 0x74, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
  0x04, 0x07, 0x0c, 0x08, 0x54, 0x65, 0x73, 0x74, 0x43, 0x69, 0x74, 0x79,
  0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x07, 0x54,
  0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
  0x55, 0x04, 0x0b, 0x0c, 0x08, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69,
  0x74, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x09,
  0x45, 0x44, 0x34, 0x34, 0x38, 0x54, 0x65, 0x73, 0x74, 0x30, 0x1e, 0x17,
  0x0d, 0x32, 0x36, 0x30, 0x36, 0x30, 0x32, 0x30, 0x30, 0x35, 0x39, 0x34,
  0x39, 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, 0x36, 0x30, 0x32, 0x30, 0x30,
  0x35, 0x39, 0x34, 0x39, 0x5a, 0x30, 0x6d, 0x31, 0x0b, 0x30, 0x09, 0x06,
  0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x12, 0x30, 0x10,
  0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x09, 0x54, 0x65, 0x73, 0x74, 0x53,
  0x74, 0x61, 0x74, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,
  0x07, 0x0c, 0x08, 0x54, 0x65, 0x73, 0x74, 0x43, 0x69, 0x74, 0x79, 0x31,
  0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x07, 0x54, 0x65,
  0x73, 0x74, 0x4f, 0x72, 0x67, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
  0x04, 0x0b, 0x0c, 0x08, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x74,
  0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x09, 0x45,
  0x44, 0x34, 0x34, 0x38, 0x54, 0x65, 0x73, 0x74, 0x30, 0x43, 0x30, 0x05,
  0x06, 0x03, 0x2b, 0x65, 0x71, 0x03, 0x3a, 0x00, 0x47, 0xba, 0x8f, 0x77,
  0x45, 0x59, 0xee, 0x91, 0x90, 0x52, 0x96, 0x9f, 0x59, 0xcd, 0xfa, 0xd5,
  0x82, 0x00, 0xc1, 0x92, 0x5c, 0x90, 0x58, 0x79, 0xaa, 0xbd, 0x74, 0xd2,
  0x2c, 0x34, 0xe8, 0x1e, 0xce, 0xbb, 0x59, 0x4d, 0xa9, 0x58, 0xaa, 0x61,
  0x86, 0x1c, 0xa3, 0xd6, 0x32, 0x64, 0xda, 0x67, 0xf7, 0x8b, 0x0e, 0xfa,
  0x09, 0xa7, 0x22, 0xfb, 0x80, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x1d, 0x06,
  0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x89, 0xc9, 0x06, 0xf9,
  0x9e, 0xb7, 0xca, 0x87, 0x48, 0x22, 0xf1, 0x19, 0xcb, 0xf8, 0x7b, 0x3d,
  0x80, 0x22, 0xa0, 0xac, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04,
  0x18, 0x30, 0x16, 0x80, 0x14, 0x89, 0xc9, 0x06, 0xf9, 0x9e, 0xb7, 0xca,
  0x87, 0x48, 0x22, 0xf1, 0x19, 0xcb, 0xf8, 0x7b, 0x3d, 0x80, 0x22, 0xa0,
  0xac, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,
  0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65,
  0x71, 0x03, 0x73, 0x00, 0x11, 0x40, 0x03, 0xee, 0xdc, 0xc6, 0x43, 0x45,
  0xf4, 0x31, 0x28, 0x89, 0x5f, 0x3d, 0x89, 0x8f, 0xd6, 0xa8, 0x0a, 0x07,
  0x0b, 0xf5, 0x5f, 0x43, 0xc0, 0xd6, 0xf0, 0xf7, 0xb1, 0x2a, 0xaa, 0x4f,
  0x93, 0xcc, 0x09, 0x6f, 0x19, 0xf6, 0xc5, 0x1c, 0x47, 0xc9, 0x0c, 0xeb,
  0x7f, 0xfe, 0xff, 0x37, 0x48, 0x1f, 0xb0, 0x45, 0x68, 0x6b, 0x92, 0xc3,
  0x80, 0x62, 0x3d, 0xa0, 0x71, 0x96, 0xdf, 0x88, 0x0d, 0x1c, 0x8d, 0x28,
  0xd6, 0xfb, 0xdf, 0x25, 0x3f, 0xfd, 0x78, 0xb2, 0xab, 0xc5, 0x39, 0x40,
  0x83, 0xe2, 0x5e, 0x1b, 0xd4, 0xa6, 0xf8, 0x4d, 0x11, 0xd2, 0xdb, 0x6c,
  0x5b, 0x86, 0x0f, 0x79, 0xc7, 0x44, 0x5b, 0xb3, 0xe0, 0xdb, 0x2f, 0xa9,
  0x83, 0x1f, 0x15, 0x3e, 0x6e, 0x54, 0x42, 0x5c, 0x35, 0x00
};

//
// PEM key data for Ed448 Private key matching the test key above
// This is an unencrypted PKCS#8 format PEM containing mEd448TestPrivateKey
// Format: -----BEGIN PRIVATE KEY----- (not ENCRYPTED)
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  mEd448TestPemKey[] = {
  0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x50,
  0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d,
  0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x45, 0x63, 0x43, 0x41, 0x51, 0x41, 0x77,
  0x42, 0x51, 0x59, 0x44, 0x4b, 0x32, 0x56, 0x78, 0x42, 0x44, 0x73, 0x45,
  0x4f, 0x52, 0x31, 0x79, 0x35, 0x35, 0x74, 0x47, 0x58, 0x38, 0x76, 0x4d,
  0x4a, 0x41, 0x63, 0x75, 0x49, 0x4a, 0x4c, 0x73, 0x74, 0x74, 0x30, 0x52,
  0x61, 0x42, 0x51, 0x4e, 0x68, 0x42, 0x2f, 0x35, 0x6a, 0x78, 0x50, 0x6c,
  0x63, 0x33, 0x69, 0x77, 0x51, 0x72, 0x66, 0x6c, 0x0a, 0x6b, 0x45, 0x58,
  0x4d, 0x46, 0x51, 0x64, 0x42, 0x5a, 0x6b, 0x5a, 0x71, 0x37, 0x38, 0x6d,
  0x65, 0x4c, 0x61, 0x6f, 0x2f, 0x4b, 0x50, 0x32, 0x73, 0x66, 0x79, 0x50,
  0x69, 0x46, 0x57, 0x43, 0x76, 0x65, 0x77, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d,
  0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41,
  0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a
};

//
// Test message for signing and verification
//
CONST CHAR8  *mEdDsaTestMessage = "Test message for EdDSA signing and verification";

VOID  *EdDsaContext1;
VOID  *EdDsaContext2;

/**
  Prerequisite function for EdDSA tests.

  @param[in]  Context  Unit test context.

  @retval UNIT_TEST_PASSED               The unit test has completed successfully.
  @retval UNIT_TEST_ERROR_TEST_FAILED    A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestVerifyEdDsaPreReq (
  UNIT_TEST_CONTEXT  Context
  )
{
  EdDsaContext1 = NULL;
  EdDsaContext2 = NULL;

  return UNIT_TEST_PASSED;
}

/**
  Cleanup function for EdDSA tests.

  @param[in]  Context  Unit test context.
**/
VOID
EFIAPI
TestVerifyEdDsaCleanUp (
  UNIT_TEST_CONTEXT  Context
  )
{
  if (EdDsaContext1 != NULL) {
    EdDsaFree (EdDsaContext1);
    EdDsaContext1 = NULL;
  }

  if (EdDsaContext2 != NULL) {
    EdDsaFree (EdDsaContext2);
    EdDsaContext2 = NULL;
  }
}

/**
  Validate UEFI-OpenSSL EdDSA Context Creation and Destruction.

  This test validates:
  - EdDsaNewByNid creates a valid context for supported curves (Ed448)
  - EdDsaNewByNid returns NULL for unsupported/invalid NIDs
  - EdDsaFree properly releases context resources
  - EdDsaFree handles NULL context gracefully

  @param[in]  Context  Unit test context.

  @retval UNIT_TEST_PASSED               The unit test has completed successfully.
  @retval UNIT_TEST_ERROR_TEST_FAILED    A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestVerifyEdDsaNew (
  UNIT_TEST_CONTEXT  Context
  )
{
  //
  // Test EdDsaNewByNid with Ed448 (supported curve)
  //
  EdDsaContext1 = EdDsaNewByNid (CRYPTO_NID_ED448);
  UT_ASSERT_NOT_NULL (EdDsaContext1);

  //
  // Verify the context can be used (set a key to confirm it's valid)
  //
  BOOLEAN  Status;

  Status = EdDsaSetPrivKey (
             EdDsaContext1,
             (UINT8 *)mEd448TestPrivateKey,
             ED448_KEY_SIZE
             );
  UT_ASSERT_TRUE (Status);

  //
  // Test EdDsaFree releases the context properly
  //
  EdDsaFree (EdDsaContext1);
  EdDsaContext1 = NULL;

  //
  // Test EdDsaNewByNid with CRYPTO_NID_NULL (invalid NID)
  //
  EdDsaContext2 = EdDsaNewByNid (CRYPTO_NID_NULL);
  UT_ASSERT_EQUAL ((UINTN)EdDsaContext2, (UINTN)NULL);

  //
  // Test EdDsaNewByNid with unsupported curve NID
  // (using an EC curve NID that's not EdDSA)
  //
  EdDsaContext2 = EdDsaNewByNid (CRYPTO_NID_SECP256R1);
  UT_ASSERT_EQUAL ((UINTN)EdDsaContext2, (UINTN)NULL);

  //
  // Test EdDsaFree with NULL context (should not crash)
  //
  EdDsaFree (NULL);

  //
  // Test creating multiple contexts simultaneously
  //
  EdDsaContext1 = EdDsaNewByNid (CRYPTO_NID_ED448);
  UT_ASSERT_NOT_NULL (EdDsaContext1);

  EdDsaContext2 = EdDsaNewByNid (CRYPTO_NID_ED448);
  UT_ASSERT_NOT_NULL (EdDsaContext2);

  //
  // Verify both contexts are independent
  //
  UT_ASSERT_NOT_EQUAL ((UINTN)EdDsaContext1, (UINTN)EdDsaContext2);

  //
  // Clean up both contexts
  //
  EdDsaFree (EdDsaContext1);
  EdDsaContext1 = NULL;

  EdDsaFree (EdDsaContext2);
  EdDsaContext2 = NULL;

  return UNIT_TEST_PASSED;
}

/**
  Validate UEFI-OpenSSL EdDSA Key Setting and Getting.

  @param[in]  Context  Unit test context.

  @retval UNIT_TEST_PASSED               The unit test has completed successfully.
  @retval UNIT_TEST_ERROR_TEST_FAILED    A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestVerifyEdDsaKeySetGet (
  UNIT_TEST_CONTEXT  Context
  )
{
  BOOLEAN  Status;
  UINT8    PublicKey[ED448_KEY_SIZE];
  UINTN    PublicKeySize;
  UINT8    TooSmallBuffer[10];
  UINTN    TooSmallSize;

  //
  // Create EdDSA context
  //
  EdDsaContext1 = EdDsaNewByNid (CRYPTO_NID_ED448);
  UT_ASSERT_NOT_NULL (EdDsaContext1);

  //
  // Test EdDsaSetPrivKey with valid key
  //
  Status = EdDsaSetPrivKey (
             EdDsaContext1,
             (UINT8 *)mEd448TestPrivateKey,
             ED448_KEY_SIZE
             );
  UT_ASSERT_TRUE (Status);

  //
  // Test EdDsaGetPubKey after setting private key
  //
  PublicKeySize = sizeof (PublicKey);
  Status        = EdDsaGetPubKey (EdDsaContext1, PublicKey, &PublicKeySize);
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (PublicKeySize, ED448_KEY_SIZE);
  UT_ASSERT_MEM_EQUAL (PublicKey, mEd448TestPublicKey, ED448_KEY_SIZE);

  //
  // Test EdDsaGetPubKey with too small buffer
  //
  TooSmallSize = sizeof (TooSmallBuffer);
  Status       = EdDsaGetPubKey (EdDsaContext1, TooSmallBuffer, &TooSmallSize);
  UT_ASSERT_FALSE (Status);
  UT_ASSERT_EQUAL (TooSmallSize, ED448_KEY_SIZE);

  //
  // Clean up context1
  //
  EdDsaFree (EdDsaContext1);
  EdDsaContext1 = NULL;

  //
  // Test EdDsaSetPubKey
  //
  EdDsaContext2 = EdDsaNewByNid (CRYPTO_NID_ED448);
  UT_ASSERT_NOT_NULL (EdDsaContext2);

  Status = EdDsaSetPubKey (
             EdDsaContext2,
             (UINT8 *)mEd448TestPublicKey,
             ED448_KEY_SIZE
             );
  UT_ASSERT_TRUE (Status);

  //
  // Test EdDsaGetPubKey after setting public key
  //
  PublicKeySize = sizeof (PublicKey);
  Status        = EdDsaGetPubKey (EdDsaContext2, PublicKey, &PublicKeySize);
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (PublicKeySize, ED448_KEY_SIZE);
  UT_ASSERT_MEM_EQUAL (PublicKey, mEd448TestPublicKey, ED448_KEY_SIZE);

  //
  // Test EdDsaSetPrivKey with NULL context
  //
  Status = EdDsaSetPrivKey (NULL, (UINT8 *)mEd448TestPrivateKey, ED448_KEY_SIZE);
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaSetPrivKey with NULL key
  //
  Status = EdDsaSetPrivKey (EdDsaContext2, NULL, ED448_KEY_SIZE);
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaSetPrivKey with wrong size
  //
  Status = EdDsaSetPrivKey (EdDsaContext2, (UINT8 *)mEd448TestPrivateKey, 32);
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaSetPubKey with NULL context
  //
  Status = EdDsaSetPubKey (NULL, (UINT8 *)mEd448TestPublicKey, ED448_KEY_SIZE);
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaSetPubKey with NULL key
  //
  Status = EdDsaSetPubKey (EdDsaContext2, NULL, ED448_KEY_SIZE);
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaSetPubKey with wrong size
  //
  Status = EdDsaSetPubKey (EdDsaContext2, (UINT8 *)mEd448TestPublicKey, 32);
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaGetPubKey with NULL context
  //
  PublicKeySize = sizeof (PublicKey);
  Status        = EdDsaGetPubKey (NULL, PublicKey, &PublicKeySize);
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaGetPubKey with NULL buffer
  //
  PublicKeySize = sizeof (PublicKey);
  Status        = EdDsaGetPubKey (EdDsaContext2, NULL, &PublicKeySize);
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaGetPubKey with NULL size
  //
  Status = EdDsaGetPubKey (EdDsaContext2, PublicKey, NULL);
  UT_ASSERT_FALSE (Status);

  return UNIT_TEST_PASSED;
}

/**
  Validate UEFI-OpenSSL EdDSA Signing and Verification.

  @param[in]  Context  Unit test context.

  @retval UNIT_TEST_PASSED               The unit test has completed successfully.
  @retval UNIT_TEST_ERROR_TEST_FAILED    A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestVerifyEdDsaSignVerify (
  UNIT_TEST_CONTEXT  Context
  )
{
  BOOLEAN  Status;
  UINT8    Signature[ED448_SIG_SIZE];
  UINTN    SigSize;
  UINTN    MessageSize;

  MessageSize = AsciiStrLen (mEdDsaTestMessage);

  //
  // Create context with private key for signing
  //
  EdDsaContext1 = EdDsaNewByNid (CRYPTO_NID_ED448);
  UT_ASSERT_NOT_NULL (EdDsaContext1);

  Status = EdDsaSetPrivKey (
             EdDsaContext1,
             (UINT8 *)mEd448TestPrivateKey,
             ED448_KEY_SIZE
             );
  UT_ASSERT_TRUE (Status);

  //
  // Test EdDsaSign without context string
  //
  SigSize = sizeof (Signature);
  Status  = EdDsaSign (
              EdDsaContext1,
              NULL,
              0,
              (UINT8 *)mEdDsaTestMessage,
              MessageSize,
              Signature,
              &SigSize
              );
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (SigSize, ED448_SIG_SIZE);

  //
  // Test EdDsaVerify with the same context
  //
  Status = EdDsaVerify (
             EdDsaContext1,
             NULL,
             0,
             (UINT8 *)mEdDsaTestMessage,
             MessageSize,
             Signature,
             SigSize
             );
  UT_ASSERT_TRUE (Status);

  //
  // Create separate context with public key for verification
  //
  EdDsaContext2 = EdDsaNewByNid (CRYPTO_NID_ED448);
  UT_ASSERT_NOT_NULL (EdDsaContext2);

  Status = EdDsaSetPubKey (
             EdDsaContext2,
             (UINT8 *)mEd448TestPublicKey,
             ED448_KEY_SIZE
             );
  UT_ASSERT_TRUE (Status);

  //
  // Test EdDsaVerify with separate public key context
  //
  Status = EdDsaVerify (
             EdDsaContext2,
             NULL,
             0,
             (UINT8 *)mEdDsaTestMessage,
             MessageSize,
             Signature,
             SigSize
             );
  UT_ASSERT_TRUE (Status);

  //
  // Test EdDsaVerify with modified message (should fail)
  //
  UINT8  ModifiedMessage[100];

  CopyMem (ModifiedMessage, mEdDsaTestMessage, MessageSize);
  ModifiedMessage[0] ^= 0xFF;

  Status = EdDsaVerify (
             EdDsaContext2,
             NULL,
             0,
             ModifiedMessage,
             MessageSize,
             Signature,
             SigSize
             );
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaVerify with modified signature (should fail)
  //
  Signature[0] ^= 0xFF;
  Status        = EdDsaVerify (
                    EdDsaContext2,
                    NULL,
                    0,
                    (UINT8 *)mEdDsaTestMessage,
                    MessageSize,
                    Signature,
                    SigSize
                    );
  UT_ASSERT_FALSE (Status);
  Signature[0] ^= 0xFF;

  return UNIT_TEST_PASSED;
}

/**
  Validate UEFI-OpenSSL EdDSA Signing and Verification with Context String.

  @param[in]  Context  Unit test context.

  @retval UNIT_TEST_PASSED               The unit test has completed successfully.
  @retval UNIT_TEST_ERROR_TEST_FAILED    A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestVerifyEdDsaSignVerifyWithContext (
  UNIT_TEST_CONTEXT  Context
  )
{
  BOOLEAN      Status;
  UINT8        Signature[ED448_SIG_SIZE];
  UINTN        SigSize;
  UINTN        MessageSize;
  CONST CHAR8  *ContextString = "test-context";
  UINTN        ContextSize;

  MessageSize = AsciiStrLen (mEdDsaTestMessage);
  ContextSize = AsciiStrLen (ContextString);

  //
  // Create context with private key
  //
  EdDsaContext1 = EdDsaNewByNid (CRYPTO_NID_ED448);
  UT_ASSERT_NOT_NULL (EdDsaContext1);

  Status = EdDsaSetPrivKey (
             EdDsaContext1,
             (UINT8 *)mEd448TestPrivateKey,
             ED448_KEY_SIZE
             );
  UT_ASSERT_TRUE (Status);

  //
  // Test EdDsaSign with context string
  //
  SigSize = sizeof (Signature);
  Status  = EdDsaSign (
              EdDsaContext1,
              (UINT8 *)ContextString,
              ContextSize,
              (UINT8 *)mEdDsaTestMessage,
              MessageSize,
              Signature,
              &SigSize
              );
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (SigSize, ED448_SIG_SIZE);

  //
  // Test EdDsaVerify with matching context string
  //
  Status = EdDsaVerify (
             EdDsaContext1,
             (UINT8 *)ContextString,
             ContextSize,
             (UINT8 *)mEdDsaTestMessage,
             MessageSize,
             Signature,
             SigSize
             );
  UT_ASSERT_TRUE (Status);

  //
  // Test EdDsaVerify with different context string (should fail)
  //
  CONST CHAR8  *WrongContext = "wrong-context";

  Status = EdDsaVerify (
             EdDsaContext1,
             (UINT8 *)WrongContext,
             AsciiStrLen (WrongContext),
             (UINT8 *)mEdDsaTestMessage,
             MessageSize,
             Signature,
             SigSize
             );
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaVerify without context string (should fail)
  //
  Status = EdDsaVerify (
             EdDsaContext1,
             NULL,
             0,
             (UINT8 *)mEdDsaTestMessage,
             MessageSize,
             Signature,
             SigSize
             );
  UT_ASSERT_FALSE (Status);

  return UNIT_TEST_PASSED;
}

/**
  Validate UEFI-OpenSSL EdDSA Error Cases.

  @param[in]  Context  Unit test context.

  @retval UNIT_TEST_PASSED               The unit test has completed successfully.
  @retval UNIT_TEST_ERROR_TEST_FAILED    A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestVerifyEdDsaErrorCases (
  UNIT_TEST_CONTEXT  Context
  )
{
  BOOLEAN  Status;
  UINT8    Signature[ED448_SIG_SIZE];
  UINTN    SigSize;
  UINTN    MessageSize;
  UINT8    TooSmallSig[10];
  UINTN    TooSmallSigSize;

  MessageSize = AsciiStrLen (mEdDsaTestMessage);

  //
  // Create context
  //
  EdDsaContext1 = EdDsaNewByNid (CRYPTO_NID_ED448);
  UT_ASSERT_NOT_NULL (EdDsaContext1);

  Status = EdDsaSetPrivKey (
             EdDsaContext1,
             (UINT8 *)mEd448TestPrivateKey,
             ED448_KEY_SIZE
             );
  UT_ASSERT_TRUE (Status);

  //
  // Test EdDsaSign with NULL context
  //
  SigSize = sizeof (Signature);
  Status  = EdDsaSign (
              NULL,
              NULL,
              0,
              (UINT8 *)mEdDsaTestMessage,
              MessageSize,
              Signature,
              &SigSize
              );
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaSign with NULL message
  //
  SigSize = sizeof (Signature);
  Status  = EdDsaSign (
              EdDsaContext1,
              NULL,
              0,
              NULL,
              MessageSize,
              Signature,
              &SigSize
              );
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaSign with too small signature buffer
  //
  TooSmallSigSize = sizeof (TooSmallSig);
  Status          = EdDsaSign (
                      EdDsaContext1,
                      NULL,
                      0,
                      (UINT8 *)mEdDsaTestMessage,
                      MessageSize,
                      TooSmallSig,
                      &TooSmallSigSize
                      );
  UT_ASSERT_FALSE (Status);
  UT_ASSERT_EQUAL (TooSmallSigSize, ED448_SIG_SIZE);

  //
  // Generate valid signature for verification tests
  //
  SigSize = sizeof (Signature);
  Status  = EdDsaSign (
              EdDsaContext1,
              NULL,
              0,
              (UINT8 *)mEdDsaTestMessage,
              MessageSize,
              Signature,
              &SigSize
              );
  UT_ASSERT_TRUE (Status);

  //
  // Test EdDsaVerify with NULL context
  //
  Status = EdDsaVerify (
             NULL,
             NULL,
             0,
             (UINT8 *)mEdDsaTestMessage,
             MessageSize,
             Signature,
             SigSize
             );
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaVerify with NULL message
  //
  Status = EdDsaVerify (
             EdDsaContext1,
             NULL,
             0,
             NULL,
             MessageSize,
             Signature,
             SigSize
             );
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaVerify with NULL signature
  //
  Status = EdDsaVerify (
             EdDsaContext1,
             NULL,
             0,
             (UINT8 *)mEdDsaTestMessage,
             MessageSize,
             NULL,
             SigSize
             );
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaVerify with wrong signature size
  //
  Status = EdDsaVerify (
             EdDsaContext1,
             NULL,
             0,
             (UINT8 *)mEdDsaTestMessage,
             MessageSize,
             Signature,
             32
             );
  UT_ASSERT_FALSE (Status);

  //
  // Test EdDsaVerify with zero signature size
  //
  Status = EdDsaVerify (
             EdDsaContext1,
             NULL,
             0,
             (UINT8 *)mEdDsaTestMessage,
             MessageSize,
             Signature,
             0
             );
  UT_ASSERT_FALSE (Status);

  return UNIT_TEST_PASSED;
}

/**
  Validate EdDsaGeneratePubKey (placeholder function).

  @param[in]  Context  Unit test context.

  @retval UNIT_TEST_PASSED               The unit test has completed successfully.
  @retval UNIT_TEST_ERROR_TEST_FAILED    A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestVerifyEdDsaGeneratePubKey (
  UNIT_TEST_CONTEXT  Context
  )
{
  BOOLEAN  Status;
  UINT8    PublicKey[ED448_KEY_SIZE];

  //
  // Create context
  //
  EdDsaContext1 = EdDsaNewByNid (CRYPTO_NID_ED448);
  UT_ASSERT_NOT_NULL (EdDsaContext1);

  //
  // EdDsaGeneratePubKey is a placeholder that always returns FALSE
  //
  Status = EdDsaGeneratePubKey (EdDsaContext1, PublicKey, ED448_KEY_SIZE);
  UT_ASSERT_FALSE (Status);

  //
  // It should return FALSE even with NULL parameters
  //
  Status = EdDsaGeneratePubKey (NULL, NULL, 0);
  UT_ASSERT_FALSE (Status);

  return UNIT_TEST_PASSED;
}

/**
  Validate EdDSA key retrieval from PEM and X509.

  @param[in]  Context  Unit test context.

  @retval UNIT_TEST_PASSED               The unit test has completed successfully.
  @retval UNIT_TEST_ERROR_TEST_FAILED    A test case assertion has failed.
**/
UNIT_TEST_STATUS
EFIAPI
TestVerifyEdDsaPemX509 (
  UNIT_TEST_CONTEXT  Context
  )
{
  BOOLEAN  Status;
  VOID     *EdDsaPrivKey;
  VOID     *EdDsaPubKey;
  UINT8    Signature[ED448_SIG_SIZE];
  UINTN    SigSize;
  UINTN    MessageSize;

  EdDsaPrivKey = NULL;
  EdDsaPubKey  = NULL;
  MessageSize  = AsciiStrLen (mEdDsaTestMessage);

  //
  // Retrieve EdDsa private key from PEM data.
  //
  Status = EdDsaGetPrivateKeyFromPem (
             mEd448TestPemKey,
             sizeof (mEd448TestPemKey),
             NULL,
             &EdDsaPrivKey
             );
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_NOT_NULL (EdDsaPrivKey);

  //
  // Retrieve EdDsa public key from X509 certificate.
  //
  Status = EdDsaGetPublicKeyFromX509 (
             mEd448TestCert,
             sizeof (mEd448TestCert),
             &EdDsaPubKey
             );
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_NOT_NULL (EdDsaPubKey);

  //
  // EdDSA signing with key from PEM
  //
  SigSize = sizeof (Signature);
  Status  = EdDsaSign (
              EdDsaPrivKey,
              NULL,
              0,
              (UINT8 *)mEdDsaTestMessage,
              MessageSize,
              Signature,
              &SigSize
              );
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (SigSize, ED448_SIG_SIZE);

  //
  // EdDSA verification with key from X509
  //
  Status = EdDsaVerify (
             EdDsaPubKey,
             NULL,
             0,
             (UINT8 *)mEdDsaTestMessage,
             MessageSize,
             Signature,
             SigSize
             );
  UT_ASSERT_TRUE (Status);

  EdDsaFree (EdDsaPrivKey);
  EdDsaFree (EdDsaPubKey);

  return UNIT_TEST_PASSED;
}

TEST_DESC  mEdDsaTest[] = {
  //
  // -----Description------------------------------------Class-------------------------Function----------------------------Pre-------------------Post--------------------Context
  //
  { "TestVerifyEdDsaNew()",                   "CryptoPkg.BaseCryptLib.EdDsa", TestVerifyEdDsaNew,                   TestVerifyEdDsaPreReq, TestVerifyEdDsaCleanUp, NULL },
  { "TestVerifyEdDsaKeySetGet()",             "CryptoPkg.BaseCryptLib.EdDsa", TestVerifyEdDsaKeySetGet,             TestVerifyEdDsaPreReq, TestVerifyEdDsaCleanUp, NULL },
  { "TestVerifyEdDsaSignVerify()",            "CryptoPkg.BaseCryptLib.EdDsa", TestVerifyEdDsaSignVerify,            TestVerifyEdDsaPreReq, TestVerifyEdDsaCleanUp, NULL },
  { "TestVerifyEdDsaSignVerifyWithContext()", "CryptoPkg.BaseCryptLib.EdDsa", TestVerifyEdDsaSignVerifyWithContext, TestVerifyEdDsaPreReq, TestVerifyEdDsaCleanUp, NULL },
  { "TestVerifyEdDsaErrorCases()",            "CryptoPkg.BaseCryptLib.EdDsa", TestVerifyEdDsaErrorCases,            TestVerifyEdDsaPreReq, TestVerifyEdDsaCleanUp, NULL },
  { "TestVerifyEdDsaGeneratePubKey()",        "CryptoPkg.BaseCryptLib.EdDsa", TestVerifyEdDsaGeneratePubKey,        TestVerifyEdDsaPreReq, TestVerifyEdDsaCleanUp, NULL },
  { "TestVerifyEdDsaPemX509()",               "CryptoPkg.BaseCryptLib.EdDsa", TestVerifyEdDsaPemX509,               TestVerifyEdDsaPreReq, TestVerifyEdDsaCleanUp, NULL },
};

UINTN  mEdDsaTestNum = ARRAY_SIZE (mEdDsaTest);
