@@ -34,7 +34,7 @@ INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
3434 return Result;
3535}
3636
37- bool FIOStoreTools::ExtractPackagesFromContainers ( const FString& ContainerDirPath, const FString& OutputDirPath, const FString& EncryptionKeysFile,
37+ bool FIOStoreTools::ExtractPackagesFromContainers ( const FString& ContainerDirPath, const FString& OutputDirPath, const FString& MainAesKey, const FString& EncryptionKeysFile,
3838 EZenPackageVersion DefaultZenPackageVersion, const FString& PackageFilter, const FString& Filter, bool SkipBulkData )
3939{
4040 TMap<FGuid, FAES::FAESKey> EncryptionKeys;
@@ -65,7 +65,11 @@ bool FIOStoreTools::ExtractPackagesFromContainers( const FString& ContainerDirPa
6565 FGuid KeyGuid;
6666 if ( FGuid::Parse ( EntryPair.Key , KeyGuid ) )
6767 {
68- const FString EncryptionKeyHex = EntryPair.Value ->AsString ();
68+ FString EncryptionKeyHex = EntryPair.Value ->AsString ();
69+ if (EncryptionKeyHex.StartsWith (" 0x" ))
70+ {
71+ EncryptionKeyHex = EncryptionKeyHex.RightChop (2 );
72+ }
6973
7074 TArray<uint8> HexToBytesBuffer;
7175 HexToBytesBuffer.AddZeroed ( EncryptionKeyHex.Len () + 1 );
@@ -84,7 +88,22 @@ bool FIOStoreTools::ExtractPackagesFromContainers( const FString& ContainerDirPa
8488 }
8589 }
8690 }
87-
91+
92+ if (!MainAesKey.IsEmpty ())
93+ {
94+ TArray<uint8> HexToBytesBuffer;
95+ HexToBytesBuffer.AddZeroed (MainAesKey.Len () + 1 );
96+ HexToBytesBuffer.SetNumZeroed (HexToBytes (MainAesKey, HexToBytesBuffer.GetData ()));
97+ if (HexToBytesBuffer.Num () != FAES::FAESKey::KeySize)
98+ {
99+ UE_LOG (LogIoStoreTools, Warning, TEXT (" Ignoring Main AES Key because it has invalid size (%d bytes vs %d expected)" ), HexToBytesBuffer.Num (), FAES::FAESKey::KeySize);
100+ }
101+ else
102+ {
103+ FMemory::Memcpy (EncryptionKeys.FindOrAdd (FGuid ()).Key , HexToBytesBuffer.GetData (), HexToBytesBuffer.Num ());
104+ }
105+ }
106+
88107 TArray<FString> FilterStrings;
89108 if (!Filter.IsEmpty ())
90109 {
@@ -193,12 +212,14 @@ bool FIOStoreTools::ExecuteIOStoreTools(const TCHAR* Cmd)
193212 {
194213 EncryptionKeysFile = FPaths::ConvertRelativePathToFull ( EncryptionKeysFile );
195214 }
196- // Legacy argument support, it should not have a forward slash
197- else if ( FParse::Value ( Cmd, TEXT (" -EncryptionKeys=" ), EncryptionKeysFile ) )
215+
216+ FString MainAesKey;
217+
218+ if (FParse::Value (Cmd, TEXT (" AES=" ), MainAesKey) && MainAesKey.StartsWith (" 0x" ))
198219 {
199- EncryptionKeysFile = FPaths::ConvertRelativePathToFull ( EncryptionKeysFile );
220+ MainAesKey = MainAesKey. RightChop ( 2 );
200221 }
201-
222+
202223 ContainerFolderPath = FPaths::ConvertRelativePathToFull ( ContainerFolderPath );
203224 ExtractFolderRootPath = FPaths::ConvertRelativePathToFull ( ExtractFolderRootPath );
204225
@@ -250,7 +271,7 @@ bool FIOStoreTools::ExecuteIOStoreTools(const TCHAR* Cmd)
250271 FString PotentialPackageFilter;
251272 FParse::Value ( Cmd, TEXT (" PackageFilter=" ), PotentialPackageFilter );
252273
253- return ExtractPackagesFromContainers ( ContainerFolderPath, ExtractFolderRootPath, EncryptionKeysFile, DefaultZenPackageVersion, PotentialPackageFilter, FilterFilePath, SkipBulkData);
274+ return ExtractPackagesFromContainers ( ContainerFolderPath, ExtractFolderRootPath, MainAesKey, EncryptionKeysFile, DefaultZenPackageVersion, PotentialPackageFilter, FilterFilePath, SkipBulkData);
254275 }
255276
256277 UE_LOG ( LogIoStoreTools, Display, TEXT (" Unknown command. Available commands: " ) );
0 commit comments