/** @file
  Application for BigNumber Primitives Validation.

Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "TestBaseCryptLib.h"

//
// Debug data
//
#define MAX_TEST_DATA_SIZE    512
#define BYTES_OF_OPERATION_A  60
#define BITS_OF_OPERATION_A   480// (8 * 60)

GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnOperationA[] = {
  0x00, 0x00, 0x00, 0x00, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
  0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2, 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
  0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
  0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f
};

GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnOperationB[] = {
  0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad,
  0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, 0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
  0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63, 0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
  0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23, 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7
};

GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnOperationC[] = {
  0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63, 0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed
};

GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnOperationExp[] = {
  0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63
};

GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnOperationMod[] = {
  0x48, 0xbe, 0xcb, 0xd5, 0x36, 0x2e, 0x93, 0x0b, 0x51, 0x45, 0x9c, 0x7d, 0xe7, 0xfe, 0x47, 0xaa,
  0xc5, 0xd3, 0x4b, 0x4f, 0x06, 0x24, 0xb4, 0x31, 0x83, 0x55, 0xb5, 0xf0, 0xda, 0x14, 0xca, 0x46
};

// BnOperationA + BnOperationB
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnResultSum[] = {
  0xb0, 0x03, 0x61, 0xa4, 0x29, 0x78, 0xf5, 0x57, 0x80, 0x52, 0x72, 0xab, 0xa0, 0x20, 0x56, 0xde,
  0xdd, 0xe7, 0x6f, 0x8d, 0xcf, 0x4c, 0xdd, 0x2d, 0xc0, 0x3f, 0x2c, 0x4f, 0xe6, 0x1c, 0x23, 0xa1,
  0x48, 0xbe, 0xcb, 0xd5, 0x36, 0x2e, 0x93, 0x0b, 0x51, 0x45, 0x9c, 0x7d, 0xe7, 0xfe, 0x47, 0xaa,
  0xc5, 0xd3, 0x4b, 0x4f, 0x06, 0x24, 0xb4, 0x31, 0x83, 0x55, 0xb5, 0xf0, 0xda, 0x14, 0xca, 0x46
};

// (BnOperationA + BnOperationC) % BnOperationMod
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnResultSumMod[] =  {
  0x16, 0x0a, 0xcf, 0x78, 0x20, 0xac, 0x31, 0x53, 0xd9, 0x0f, 0x22, 0xfc, 0x08, 0x8d, 0xde, 0x0d,
  0x29, 0xf4, 0x07, 0xdd, 0xfa, 0xf5, 0x61, 0xd4, 0x1a, 0xe5, 0xa1, 0xef, 0x4a, 0x37, 0xfe, 0xec
};

// (BnOperationA * BnOperationC) % BnOperationMod
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnResultMulMod[] =  {
  0x01, 0xDB, 0xD2, 0x82, 0xC9, 0x24, 0x66, 0x2A, 0x96, 0x05, 0x11, 0xF2, 0x31, 0xF0, 0xCB, 0x28,
  0xBA, 0x5C, 0xBE, 0x7D, 0xEE, 0x37, 0x25, 0xB1, 0x24, 0x7E, 0x15, 0xAB, 0xCD, 0x86, 0x8E, 0x39
};

// BnOperationA / BnOperationMod
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnResultDiv[] =  {
  0x02, 0x06, 0xA6, 0xDC, 0x2E, 0x97, 0x05, 0xEA, 0xCD, 0xF7, 0xAB, 0xCD, 0xE5, 0x9C, 0x33, 0x03,
  0xCE, 0x3D, 0x7E, 0x63, 0x23, 0xB2, 0xEC, 0xED, 0x96, 0x9D, 0xC9, 0xBB, 0x78
};

// BnOperationA % BnOperationMod
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnResultMod[] =  {
  0x06, 0x2A, 0x8D, 0x06, 0x9D, 0x14, 0x53, 0x3B, 0x05, 0xD9, 0x86, 0x00, 0xA5, 0xB9, 0x05, 0x7F,
  0xC1, 0x82, 0xEC, 0x23, 0x44, 0x23, 0xC8, 0xA2, 0x42, 0xB3, 0x43, 0xB8, 0x7C, 0xD6, 0xB1, 0xCF
};

// BnOperationA % BnOperationMod
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnResultInverseMod[] =  {
  0x3a, 0xeb, 0xc5, 0x98, 0x9c, 0x22, 0xd6, 0x76, 0x7d, 0x1c, 0xc6, 0xd6, 0xbb, 0x1b, 0xed, 0xfd,
  0x0f, 0x34, 0xbf, 0xe0, 0x2b, 0x4a, 0x26, 0xc3, 0xc0, 0xd9, 0x57, 0xc7, 0x11, 0xc0, 0xd6, 0x35
};

// BnOperationA % BnOperationMod
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnResultExpMod[] =  {
  0x39, 0xf8, 0x74, 0xa0, 0xe8, 0x02, 0x8b, 0xf2, 0x22, 0x62, 0x82, 0x4c, 0xe0, 0xed, 0x63, 0x48,
  0xb9, 0xa2, 0xaa, 0xbc, 0xba, 0xb1, 0xd3, 0x6a, 0x02, 0xfd, 0xf3, 0x0e, 0x3a, 0x19, 0x39, 0x37
};

// BnOperationA >> 128
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnResultRShift[] =  {
  0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
  0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2, 0x0a, 0x9e, 0xee, 0xe6,0x4b,  0x55, 0xd3, 0x9a,
  0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23,0xa3,  0xfe, 0xeb, 0xbd
};

// 0x12345678
GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8  BnResultUIntSet[] =  { 0x12, 0x34, 0x56, 0x78 };

typedef struct {
  VOID    *BnA;
  VOID    *BnB;
  VOID    *BnC;
  VOID    *BnD;
  VOID    *BnCTX;
} BN_TEST_CONTEXT;

GLOBAL_REMOVE_IF_UNREFERENCED STATIC BN_TEST_CONTEXT  mBnContext = { NULL, NULL, NULL, NULL, NULL };

//
// Debug function
//
STATIC
BOOLEAN
EqualBn2Bn (
  CONST VOID  *Expected,
  CONST VOID  *Actual
  )
{
  if (BigNumCmp (Expected, Actual) == 0) {
    return TRUE;
  }

  return FALSE;
}

STATIC
BOOLEAN
EqualBn2Bin (
  CONST VOID   *Bn,
  CONST UINT8  *Buffer,
  CONST UINTN  BufferSize
  )
{
  UINTN  BnTestBufferSize;
  UINT8  BnTestBuffer[MAX_TEST_DATA_SIZE];

  BnTestBufferSize = BigNumToBin (Bn, BnTestBuffer);
  if (BnTestBufferSize == BufferSize) {
    if (CompareMem (Buffer, BnTestBuffer, BnTestBufferSize) == 0) {
      return TRUE;
    }
  }

  return FALSE;
}

UNIT_TEST_STATUS
EFIAPI
TestVerifyBnPreReq (
  UNIT_TEST_CONTEXT  Context
  )
{
  BN_TEST_CONTEXT  *BnContext;

  BnContext        = Context;
  BnContext->BnCTX = BigNumNewContext ();
  BnContext->BnA   = BigNumInit ();
  BnContext->BnB   = BigNumInit ();
  BnContext->BnC   = BigNumInit ();
  BnContext->BnD   = BigNumInit ();
  if (  (BnContext->BnCTX == NULL)
     || (BnContext->BnA == NULL)
     || (BnContext->BnB == NULL)
     || (BnContext->BnC == NULL)
     || (BnContext->BnD == NULL)
        )
  {
    return UNIT_TEST_ERROR_TEST_FAILED;
  }

  return UNIT_TEST_PASSED;
}

VOID
EFIAPI
TestVerifyBnCleanUp (
  UNIT_TEST_CONTEXT  Context
  )
{
  BN_TEST_CONTEXT  *BnContext;

  BnContext = Context;
  BigNumContextFree (BnContext->BnCTX);
  BigNumFree (BnContext->BnA, TRUE);
  BigNumFree (BnContext->BnB, TRUE);
  BigNumFree (BnContext->BnC, TRUE);
  BigNumFree (BnContext->BnD, TRUE);
}

UNIT_TEST_STATUS
EFIAPI
TestVerifyBn (
  IN UNIT_TEST_CONTEXT  Context
  )
{
  BN_TEST_CONTEXT  *BnContext;
  UINTN            Num;
  CONST VOID       *BnOne;

  BnContext = Context;

  // Calculation tests
  BnContext->BnA = BigNumFromBin (BnOperationA, sizeof (BnOperationA));
  BnContext->BnB = BigNumFromBin (BnOperationB, sizeof (BnOperationB));
  // C=A+B
  BigNumAdd (BnContext->BnA, BnContext->BnB, BnContext->BnC);
  UT_ASSERT_TRUE (EqualBn2Bin (BnContext->BnC, BnResultSum, sizeof (BnResultSum)));
  // D=C-A=B
  BigNumSub (BnContext->BnC, BnContext->BnA, BnContext->BnD);
  UT_ASSERT_TRUE (EqualBn2Bn (BnContext->BnB, BnContext->BnD));
  // C=(A+B)%D
  BnContext->BnD = BigNumFromBin (BnOperationMod, sizeof (BnOperationMod));
  BigNumAddMod (BnContext->BnA, BnContext->BnB, BnContext->BnD, BnContext->BnC);
  UT_ASSERT_TRUE (EqualBn2Bin (BnContext->BnC, BnResultSumMod, sizeof (BnResultSumMod)));
  // C=(A*B)%D
  BigNumMulMod (BnContext->BnA, BnContext->BnB, BnContext->BnD, BnContext->BnC);
  UT_ASSERT_TRUE (EqualBn2Bin (BnContext->BnC, BnResultMulMod, sizeof (BnResultMulMod)));
  // C=A/D
  BigNumDiv (BnContext->BnA, BnContext->BnD, BnContext->BnC);
  UT_ASSERT_TRUE (EqualBn2Bin (BnContext->BnC, BnResultDiv, sizeof (BnResultDiv)));
  // C=A%D
  BigNumMod (BnContext->BnA, BnContext->BnD, BnContext->BnC);
  UT_ASSERT_TRUE (EqualBn2Bin (BnContext->BnC, BnResultMod, sizeof (BnResultMod)));
  // 1=(A*C)%D
  BigNumInverseMod (BnContext->BnA, BnContext->BnD, BnContext->BnC);
  UT_ASSERT_TRUE (EqualBn2Bin (BnContext->BnC, BnResultInverseMod, sizeof (BnResultInverseMod)));
  // C=(A^B)%D
  BnContext->BnB = BigNumFromBin (BnOperationExp, sizeof (BnOperationExp));
  BigNumExpMod (BnContext->BnA, BnContext->BnB, BnContext->BnD, BnContext->BnC);
  UT_ASSERT_TRUE (EqualBn2Bin (BnContext->BnC, BnResultExpMod, sizeof (BnResultExpMod)));
  // C=A>>128
  BigNumRShift (BnContext->BnA, 128, BnContext->BnC);
  UT_ASSERT_TRUE (EqualBn2Bin (BnContext->BnC, BnResultRShift, sizeof (BnResultRShift)));
  // C=0x12345678
  BigNumSetUint (BnContext->BnC, 0x12345678);
  UT_ASSERT_TRUE (EqualBn2Bin (BnContext->BnC, BnResultUIntSet, sizeof (BnResultUIntSet)));
  // Bn compare
  UT_ASSERT_TRUE (BigNumIsWord (BnContext->BnC, 0x12345678));
  UT_ASSERT_FALSE (BigNumIsWord (BnContext->BnC, 0x12345600));
  UT_ASSERT_FALSE (BigNumIsOdd (BnContext->BnC));
  UT_ASSERT_TRUE (BigNumIsOdd (BnContext->BnA));

  // Other tests
  BigNumConstTime (BnContext->BnA);
  Num = BigNumBytes (BnContext->BnA);
  UT_ASSERT_EQUAL (Num, BYTES_OF_OPERATION_A);
  Num = BigNumBits (BnContext->BnA);
  UT_ASSERT_EQUAL (Num, BITS_OF_OPERATION_A);
  BnOne = BigNumValueOne ();
  if (BnOne == NULL) {
    return UNIT_TEST_ERROR_TEST_FAILED;
  }

  UT_ASSERT_TRUE (BigNumIsWord (BnOne, 0x1));

  return UNIT_TEST_PASSED;
}

TEST_DESC  mBnTest[] = {
  //
  // -----Description----------------Class---------------------Function-----------Pre----------------Post---------Context
  //
  { "TestVerifyBn()", "CryptoPkg.BaseCryptLib.BigNumber", TestVerifyBn, TestVerifyBnPreReq, TestVerifyBnCleanUp, &mBnContext },
};

UINTN  mBnTestNum = ARRAY_SIZE (mBnTest);
