/** @file
  Application for RSA Primitives Validation.

Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "TestBaseCryptLib.h"

#define  RSA_MODULUS_LENGTH  512

//
// RSA PKCS#1 Validation Data from OpenSSL "Fips_rsa_selftest.c"
//

//
// Public Modulus of RSA Key
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  RsaN[] = {
  0xBB, 0xF8, 0x2F, 0x09, 0x06, 0x82, 0xCE, 0x9C, 0x23, 0x38, 0xAC, 0x2B, 0x9D, 0xA8, 0x71, 0xF7,
  0x36, 0x8D, 0x07, 0xEE, 0xD4, 0x10, 0x43, 0xA4, 0x40, 0xD6, 0xB6, 0xF0, 0x74, 0x54, 0xF5, 0x1F,
  0xB8, 0xDF, 0xBA, 0xAF, 0x03, 0x5C, 0x02, 0xAB, 0x61, 0xEA, 0x48, 0xCE, 0xEB, 0x6F, 0xCD, 0x48,
  0x76, 0xED, 0x52, 0x0D, 0x60, 0xE1, 0xEC, 0x46, 0x19, 0x71, 0x9D, 0x8A, 0x5B, 0x8B, 0x80, 0x7F,
  0xAF, 0xB8, 0xE0, 0xA3, 0xDF, 0xC7, 0x37, 0x72, 0x3E, 0xE6, 0xB4, 0xB7, 0xD9, 0x3A, 0x25, 0x84,
  0xEE, 0x6A, 0x64, 0x9D, 0x06, 0x09, 0x53, 0x74, 0x88, 0x34, 0xB2, 0x45, 0x45, 0x98, 0x39, 0x4E,
  0xE0, 0xAA, 0xB1, 0x2D, 0x7B, 0x61, 0xA5, 0x1F, 0x52, 0x7A, 0x9A, 0x41, 0xF6, 0xC1, 0x68, 0x7F,
  0xE2, 0x53, 0x72, 0x98, 0xCA, 0x2A, 0x8F, 0x59, 0x46, 0xF8, 0xE5, 0xFD, 0x09, 0x1D, 0xBD, 0xCB
};

//
// Public Exponent of RSA Key
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  RsaE[] = { 0x11 };

//
// Private Exponent of RSA Key
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  RsaD[] = {
  0xA5, 0xDA, 0xFC, 0x53, 0x41, 0xFA, 0xF2, 0x89, 0xC4, 0xB9, 0x88, 0xDB, 0x30, 0xC1, 0xCD, 0xF8,
  0x3F, 0x31, 0x25, 0x1E, 0x06, 0x68, 0xB4, 0x27, 0x84, 0x81, 0x38, 0x01, 0x57, 0x96, 0x41, 0xB2,
  0x94, 0x10, 0xB3, 0xC7, 0x99, 0x8D, 0x6B, 0xC4, 0x65, 0x74, 0x5E, 0x5C, 0x39, 0x26, 0x69, 0xD6,
  0x87, 0x0D, 0xA2, 0xC0, 0x82, 0xA9, 0x39, 0xE3, 0x7F, 0xDC, 0xB8, 0x2E, 0xC9, 0x3E, 0xDA, 0xC9,
  0x7F, 0xF3, 0xAD, 0x59, 0x50, 0xAC, 0xCF, 0xBC, 0x11, 0x1C, 0x76, 0xF1, 0xA9, 0x52, 0x94, 0x44,
  0xE5, 0x6A, 0xAF, 0x68, 0xC5, 0x6C, 0x09, 0x2C, 0xD3, 0x8D, 0xC3, 0xBE, 0xF5, 0xD2, 0x0A, 0x93,
  0x99, 0x26, 0xED, 0x4F, 0x74, 0xA1, 0x3E, 0xDD, 0xFB, 0xE1, 0xA1, 0xCE, 0xCC, 0x48, 0x94, 0xAF,
  0x94, 0x28, 0xC2, 0xB7, 0xB8, 0x88, 0x3F, 0xE4, 0x46, 0x3A, 0x4B, 0xC8, 0x5B, 0x1C, 0xB3, 0xC1
};

//
// Known Answer Test (KAT) Data for RSA PKCS#1 Signing
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8  RsaSignData[] = "OpenSSL FIPS 140-2 Public Key RSA KAT";

//
// Known Signature for the above message, under SHA-1 Digest
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  RsaPkcs1Signature[] = {
  0x71, 0xEE, 0x1A, 0xC0, 0xFE, 0x01, 0x93, 0x54, 0x79, 0x5C, 0xF2, 0x4C, 0x4A, 0xFD, 0x1A, 0x05,
  0x8F, 0x64, 0xB1, 0x6D, 0x61, 0x33, 0x8D, 0x9B, 0xE7, 0xFD, 0x60, 0xA3, 0x83, 0xB5, 0xA3, 0x51,
  0x55, 0x77, 0x90, 0xCF, 0xDC, 0x22, 0x37, 0x8E, 0xD0, 0xE1, 0xAE, 0x09, 0xE3, 0x3D, 0x1E, 0xF8,
  0x80, 0xD1, 0x8B, 0xC2, 0xEC, 0x0A, 0xD7, 0x6B, 0x88, 0x8B, 0x8B, 0xA1, 0x20, 0x22, 0xBE, 0x59,
  0x5B, 0xE0, 0x23, 0x24, 0xA1, 0x49, 0x30, 0xBA, 0xA9, 0x9E, 0xE8, 0xB1, 0x8A, 0x62, 0x16, 0xBF,
  0x4E, 0xCA, 0x2E, 0x4E, 0xBC, 0x29, 0xA8, 0x67, 0x13, 0xB7, 0x9F, 0x1D, 0x04, 0x44, 0xE5, 0x5F,
  0x35, 0x07, 0x11, 0xBC, 0xED, 0x19, 0x37, 0x21, 0xCF, 0x23, 0x48, 0x1F, 0x72, 0x05, 0xDE, 0xE6,
  0xE8, 0x7F, 0x33, 0x8A, 0x76, 0x4B, 0x2F, 0x95, 0xDF, 0xF1, 0x5F, 0x84, 0x80, 0xD9, 0x46, 0xB4
};

//
// Default public key 0x10001 = 65537
//
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  DefaultPublicKey[] = {
  0x01, 0x00, 0x01
};

VOID  *mRsa;

UNIT_TEST_STATUS
EFIAPI
TestVerifyRsaPreReq (
  UNIT_TEST_CONTEXT  Context
  )
{
  mRsa = RsaNew ();

  if (mRsa == NULL) {
    return UNIT_TEST_ERROR_TEST_FAILED;
  }

  return UNIT_TEST_PASSED;
}

VOID
EFIAPI
TestVerifyRsaCleanUp (
  UNIT_TEST_CONTEXT  Context
  )
{
  if (mRsa != NULL) {
    RsaFree (mRsa);
    mRsa = NULL;
  }
}

UNIT_TEST_STATUS
EFIAPI
TestVerifyRsaSetGetKeyComponents (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  BOOLEAN  Status;
  UINTN    KeySize;
  UINT8    *KeyBuffer;

  //
  // Set/Get RSA Key Components
  //

  //
  // Set/Get RSA Key N
  //
  Status = RsaSetKey (mRsa, RsaKeyN, RsaN, sizeof (RsaN));
  UT_ASSERT_TRUE (Status);

  KeySize = 0;
  Status  = RsaGetKey (mRsa, RsaKeyN, NULL, &KeySize);
  UT_ASSERT_FALSE (Status);
  UT_ASSERT_EQUAL (KeySize, sizeof (RsaN));

  KeyBuffer = AllocatePool (KeySize);
  if (KeyBuffer == NULL) {
    UT_LOG_ERROR ("Failed to allocate memory for KeyBuffer");
    return UNIT_TEST_ERROR_TEST_FAILED;
  }

  Status = RsaGetKey (mRsa, RsaKeyN, KeyBuffer, &KeySize);
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (KeySize, sizeof (RsaN));

  UT_ASSERT_MEM_EQUAL (KeyBuffer, RsaN, KeySize);

  FreePool (KeyBuffer);

  //
  // Set/Get RSA Key E
  //
  Status = RsaSetKey (mRsa, RsaKeyE, RsaE, sizeof (RsaE));
  UT_ASSERT_TRUE (Status);

  KeySize = 0;
  Status  = RsaGetKey (mRsa, RsaKeyE, NULL, &KeySize);
  UT_ASSERT_FALSE (Status);
  UT_ASSERT_EQUAL (KeySize, sizeof (RsaE));

  KeyBuffer = AllocatePool (KeySize);
  if (KeyBuffer == NULL) {
    UT_LOG_ERROR ("Failed to allocate memory for KeyBuffer");
    return UNIT_TEST_ERROR_TEST_FAILED;
  }

  Status = RsaGetKey (mRsa, RsaKeyE, KeyBuffer, &KeySize);
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (KeySize, sizeof (RsaE));

  UT_ASSERT_MEM_EQUAL (KeyBuffer, RsaE, KeySize);

  FreePool (KeyBuffer);

  //
  // Clear/Get RSA Key Components
  //

  //
  // Clear/Get RSA Key N
  //
  Status = RsaSetKey (mRsa, RsaKeyN, NULL, 0);
  UT_ASSERT_TRUE (Status);

  KeySize = 1;
  Status  = RsaGetKey (mRsa, RsaKeyN, NULL, &KeySize);
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (KeySize, 0);

  //
  // Clear/Get RSA Key E
  //
  Status = RsaSetKey (mRsa, RsaKeyE, NULL, 0);
  UT_ASSERT_TRUE (Status);

  KeySize = 1;
  Status  = RsaGetKey (mRsa, RsaKeyE, NULL, &KeySize);
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (KeySize, 0);

  return UNIT_TEST_PASSED;
}

UNIT_TEST_STATUS
EFIAPI
TestVerifyRsaGenerateKeyComponents (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  BOOLEAN  Status;
  UINTN    KeySize;
  UINT8    *KeyBuffer;
  UINT8    TestPublicExponent1[] = { 0x03 };
  UINT8    TestPublicExponent2[] = { 0x01, 0x01 };
  UINT8    TestPublicExponent3[] = { 0x01, 0x00, 0x01 };

  //
  // Generate RSA Key Components
  //

  Status = RsaGenerateKey (mRsa, RSA_MODULUS_LENGTH, NULL, 0);
  UT_ASSERT_TRUE (Status);

  Status = RsaGenerateKey (mRsa, RSA_MODULUS_LENGTH, TestPublicExponent1, sizeof (TestPublicExponent1));
  UT_ASSERT_TRUE (Status);
  Status = RsaGenerateKey (mRsa, RSA_MODULUS_LENGTH, TestPublicExponent2, sizeof (TestPublicExponent2));
  UT_ASSERT_TRUE (Status);
  Status = RsaGenerateKey (mRsa, RSA_MODULUS_LENGTH, TestPublicExponent3, sizeof (TestPublicExponent3));
  UT_ASSERT_TRUE (Status);

  KeySize   = RSA_MODULUS_LENGTH / 8;
  KeyBuffer = AllocatePool (KeySize);
  if (KeyBuffer == NULL) {
    UT_LOG_ERROR ("Failed to allocate memory for KeyBuffer");
    return UNIT_TEST_ERROR_TEST_FAILED;
  }

  Status = RsaGetKey (mRsa, RsaKeyE, KeyBuffer, &KeySize);
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (KeySize, 3);
  UT_ASSERT_MEM_EQUAL (KeyBuffer, DefaultPublicKey, 3);

  KeySize = RSA_MODULUS_LENGTH / 8;
  Status  = RsaGetKey (mRsa, RsaKeyN, KeyBuffer, &KeySize);
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (KeySize, RSA_MODULUS_LENGTH / 8);

  Status = RsaCheckKey (mRsa);
  UT_ASSERT_TRUE (Status);

  //
  // Check invalid RSA key components
  //
  Status = RsaSetKey (mRsa, RsaKeyN, RsaN, sizeof (RsaN));
  UT_ASSERT_TRUE (Status);

  Status = RsaCheckKey (mRsa);
  UT_ASSERT_FALSE (Status);

  Status = RsaSetKey (mRsa, RsaKeyN, KeyBuffer, KeySize);
  UT_ASSERT_TRUE (Status);

  Status = RsaCheckKey (mRsa);
  UT_ASSERT_TRUE (Status);

  Status = RsaSetKey (mRsa, RsaKeyE, RsaE, sizeof (RsaE));
  UT_ASSERT_TRUE (Status);

  Status = RsaCheckKey (mRsa);
  UT_ASSERT_FALSE (Status);

  FreePool (KeyBuffer);

  return UNIT_TEST_PASSED;
}

UNIT_TEST_STATUS
EFIAPI
TestVerifyRsaPkcs1SignVerify (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  UINT8    HashValue[SHA1_DIGEST_SIZE];
  UINTN    HashSize;
  UINT8    *Signature;
  UINTN    SigSize;
  BOOLEAN  Status;

  //
  // SHA-1 Digest Message for PKCS#1 Signature
  //
  HashSize = SHA1_DIGEST_SIZE;
  ZeroMem (HashValue, HashSize);

  Status = Sha1HashAll (RsaSignData, AsciiStrLen (RsaSignData), HashValue);
  UT_ASSERT_TRUE (Status);

  //
  // Sign RSA PKCS#1-encoded Signature
  //

  Status = RsaSetKey (mRsa, RsaKeyN, RsaN, sizeof (RsaN));
  UT_ASSERT_TRUE (Status);

  Status = RsaSetKey (mRsa, RsaKeyE, RsaE, sizeof (RsaE));
  UT_ASSERT_TRUE (Status);

  Status = RsaSetKey (mRsa, RsaKeyD, RsaD, sizeof (RsaD));
  UT_ASSERT_TRUE (Status);

  SigSize = 0;
  Status  = RsaPkcs1Sign (mRsa, HashValue, HashSize, NULL, &SigSize);
  UT_ASSERT_FALSE (Status);
  UT_ASSERT_NOT_EQUAL (SigSize, 0);

  Signature = AllocatePool (SigSize);
  if (Signature == NULL) {
    UT_LOG_ERROR ("Failed to allocate memory for Signature");
    return UNIT_TEST_ERROR_TEST_FAILED;
  }

  Status = RsaPkcs1Sign (mRsa, HashValue, HashSize, Signature, &SigSize);
  UT_ASSERT_TRUE (Status);
  UT_ASSERT_EQUAL (SigSize, sizeof (RsaPkcs1Signature));

  UT_ASSERT_MEM_EQUAL (Signature, RsaPkcs1Signature, SigSize);

  //
  // Verify RSA PKCS#1-encoded Signature
  //
  Status = RsaPkcs1Verify (mRsa, HashValue, HashSize, Signature, SigSize);
  UT_ASSERT_TRUE (Status);

  FreePool (Signature);

  return UNIT_TEST_PASSED;
}

TEST_DESC  mRsaTest[] = {
  //
  // -----Description--------------------------------------Class----------------------Function---------------------------------Pre---------------------Post---------Context
  //
  { "TestVerifyRsaSetGetKeyComponents()",   "CryptoPkg.BaseCryptLib.Rsa", TestVerifyRsaSetGetKeyComponents,   TestVerifyRsaPreReq, TestVerifyRsaCleanUp, NULL },
  { "TestVerifyRsaGenerateKeyComponents()", "CryptoPkg.BaseCryptLib.Rsa", TestVerifyRsaGenerateKeyComponents, TestVerifyRsaPreReq, TestVerifyRsaCleanUp, NULL },
  { "TestVerifyRsaPkcs1SignVerify()",       "CryptoPkg.BaseCryptLib.Rsa", TestVerifyRsaPkcs1SignVerify,       TestVerifyRsaPreReq, TestVerifyRsaCleanUp, NULL },
};

UINTN  mRsaTestNum = ARRAY_SIZE (mRsaTest);
