]> git.proxmox.com Git - mirror_edk2.git/commitdiff
CryptoPkg/Test: Add unit test for CryptoBn
authorYi Li <yi1.li@intel.com>
Thu, 12 May 2022 09:10:16 +0000 (17:10 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 23 Sep 2022 10:08:24 +0000 (10:08 +0000)
Add unit test for CryptoBn.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Xiaoyu Lu <xiaoyu1.lu@intel.com>
Cc: Guomin Jiang <guomin.jiang@intel.com>
Signed-off-by: Yi Li <yi1.li@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
CryptoPkg/Library/BaseCryptLib/UnitTestHostBaseCryptLib.inf
CryptoPkg/Test/UnitTest/Library/BaseCryptLib/BaseCryptLibUnitTests.c
CryptoPkg/Test/UnitTest/Library/BaseCryptLib/BnTests.c [new file with mode: 0644]
CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLib.h
CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHost.inf
CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibShell.inf

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