+ This function will find out all valid public keys in public key database, save them in new allocated \r
+ buffer NewPubKeyStore, and give the new PubKeyIndex. The caller is responsible for freeing buffer\r
+ NewPubKeyIndex and NewPubKeyStore with FreePool().\r
+\r
+ @param[in] PubKeyStore Point to the public key database.\r
+ @param[in] PubKeyNumber Number of the public key in PubKeyStore.\r
+ @param[out] NewPubKeyIndex Point to an array of new PubKeyIndex corresponds to NewPubKeyStore.\r
+ @param[out] NewPubKeyStore Saved all valid public keys in PubKeyStore.\r
+ @param[out] NewPubKeySize Buffer size of the NewPubKeyStore.\r
+ \r
+ @retval EFI_SUCCESS Trim operation is complete successfully.\r
+ @retval EFI_OUT_OF_RESOURCES No enough memory resources, or no useless key in PubKeyStore.\r
+ \r
+**/\r
+EFI_STATUS\r
+PubKeyStoreFilter (\r
+ IN UINT8 *PubKeyStore,\r
+ IN UINT32 PubKeyNumber,\r
+ OUT UINT32 **NewPubKeyIndex,\r
+ OUT UINT8 **NewPubKeyStore,\r
+ OUT UINT32 *NewPubKeySize\r
+ )\r
+{\r
+ UINT32 PubKeyIndex;\r
+ UINT32 CopiedKey;\r
+ UINT32 NewPubKeyNumber;\r
+ \r
+ NewPubKeyNumber = GetValidPubKeyNumber (PubKeyNumber);\r
+ if (NewPubKeyNumber == PubKeyNumber) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ if (NewPubKeyNumber != 0) {\r
+ *NewPubKeySize = NewPubKeyNumber * EFI_CERT_TYPE_RSA2048_SIZE;\r
+ } else {\r
+ *NewPubKeySize = sizeof (UINT8);\r
+ }\r
+\r
+ *NewPubKeyStore = AllocatePool (*NewPubKeySize);\r
+ if (*NewPubKeyStore == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ *NewPubKeyIndex = AllocateZeroPool ((PubKeyNumber + 1) * sizeof (UINT32));\r
+ if (*NewPubKeyIndex == NULL) {\r
+ FreePool (*NewPubKeyStore);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ CopiedKey = 0;\r
+ for (PubKeyIndex = 1; PubKeyIndex <= PubKeyNumber; PubKeyIndex++) {\r
+ if (IsValidPubKeyIndex (PubKeyIndex)) {\r
+ CopyMem (\r
+ *NewPubKeyStore + CopiedKey * EFI_CERT_TYPE_RSA2048_SIZE,\r
+ PubKeyStore + (PubKeyIndex - 1) * EFI_CERT_TYPE_RSA2048_SIZE,\r
+ EFI_CERT_TYPE_RSA2048_SIZE\r
+ );\r
+ (*NewPubKeyIndex)[PubKeyIndex] = ++CopiedKey;\r
+ }\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+\r
+ Variable store garbage collection and reclaim operation.\r
+\r
+ If ReclaimPubKeyStore is FALSE, reclaim variable space by deleting the obsoleted varaibles.\r
+ If ReclaimPubKeyStore is TRUE, reclaim invalid key in public key database and update the PubKeyIndex\r
+ for all the count-based authenticate variable in NV storage.\r
+\r
+ @param[in] VariableBase Base address of variable store.\r
+ @param[out] LastVariableOffset Offset of last variable.\r
+ @param[in] IsVolatile The variable store is volatile or not;\r
+ if it is non-volatile, need FTW.\r
+ @param[in, out] UpdatingPtrTrack Pointer to updating variable pointer track structure.\r
+ @param[in] ReclaimPubKeyStore Reclaim for public key database or not.\r
+ @param[in] ReclaimAnyway If TRUE, do reclaim anyway.\r
+ \r
+ @return EFI_OUT_OF_RESOURCES No enough memory resources.\r
+ @return EFI_SUCCESS Reclaim operation has finished successfully.\r
+ @return Others Unexpect error happened during reclaim operation.\r