diff --git a/SabreTools.Helper/Data/Flags.cs b/SabreTools.Helper/Data/Flags.cs index 0a2122e8..cde22def 100644 --- a/SabreTools.Helper/Data/Flags.cs +++ b/SabreTools.Helper/Data/Flags.cs @@ -252,6 +252,10 @@ namespace SabreTools.Helper.Data SHA256 = 0x0008, SHA384 = 0x0010, SHA512 = 0x0020, + + // Special combinations + Standard = CRC & MD5 & SHA1, + DeepHashes = MD5 & SHA1 & SHA256 & SHA384 & SHA512, } #endregion diff --git a/SabreTools.Helper/Dats/Partials/DatFile.ConvertUpdate.cs b/SabreTools.Helper/Dats/Partials/DatFile.ConvertUpdate.cs index 15815251..cc37bf2b 100644 --- a/SabreTools.Helper/Dats/Partials/DatFile.ConvertUpdate.cs +++ b/SabreTools.Helper/Dats/Partials/DatFile.ConvertUpdate.cs @@ -466,7 +466,15 @@ namespace SabreTools.Helper.Dats { rom.SHA256 = null; } - + if ((StripHash & Hash.SHA384) != 0) + { + rom.SHA384 = null; + } + if ((StripHash & Hash.SHA512) != 0) + { + rom.SHA512 = null; + } + items[j] = rom; } else if (item.Type == ItemType.Disk) diff --git a/SabreTools.Helper/Dats/Partials/DatFile.DFD.cs b/SabreTools.Helper/Dats/Partials/DatFile.DFD.cs index 0c89ddcb..2c230cad 100644 --- a/SabreTools.Helper/Dats/Partials/DatFile.DFD.cs +++ b/SabreTools.Helper/Dats/Partials/DatFile.DFD.cs @@ -226,7 +226,7 @@ namespace SabreTools.Helper.Dats } // If all deep hash skip flags are set, do a quickscan - if (omitFromScan == (Hash.MD5 & Hash.SHA1 & Hash.SHA256 & Hash.SHA384 & Hash.SHA512)) + if (omitFromScan == Hash.DeepHashes) { ArchiveType? type = ArchiveTools.GetCurrentArchiveType(newItem, logger); diff --git a/SabreTools.Helper/Tools/FileTools.cs b/SabreTools.Helper/Tools/FileTools.cs index 9cc71a7b..4ef0505a 100644 --- a/SabreTools.Helper/Tools/FileTools.cs +++ b/SabreTools.Helper/Tools/FileTools.cs @@ -531,6 +531,8 @@ namespace SabreTools.Helper.Tools MD5 md5 = MD5.Create(); SHA1 sha1 = SHA1.Create(); SHA256 sha256 = SHA256.Create(); + SHA384 sha384 = SHA384.Create(); + SHA512 sha512 = SHA512.Create(); // Seek to the starting position, if one is set if (offset < 0) @@ -559,6 +561,14 @@ namespace SabreTools.Helper.Tools { sha256.TransformBlock(buffer, 0, read, buffer, 0); } + if ((omitFromScan & Hash.SHA384) == 0) + { + sha384.TransformBlock(buffer, 0, read, buffer, 0); + } + if ((omitFromScan & Hash.SHA512) == 0) + { + sha512.TransformBlock(buffer, 0, read, buffer, 0); + } } crc.Update(buffer, 0, 0); @@ -579,12 +589,24 @@ namespace SabreTools.Helper.Tools sha256.TransformFinalBlock(buffer, 0, 0); rom.SHA256 = BitConverter.ToString(sha256.Hash).Replace("-", "").ToLowerInvariant(); } + if ((omitFromScan & Hash.SHA384) == 0) + { + sha384.TransformFinalBlock(buffer, 0, 0); + rom.SHA384 = BitConverter.ToString(sha384.Hash).Replace("-", "").ToLowerInvariant(); + } + if ((omitFromScan & Hash.SHA512) == 0) + { + sha512.TransformFinalBlock(buffer, 0, 0); + rom.SHA512 = BitConverter.ToString(sha512.Hash).Replace("-", "").ToLowerInvariant(); + } // Dispose of the hashers crc.Dispose(); md5.Dispose(); sha1.Dispose(); sha256.Dispose(); + sha384.Dispose(); + sha512.Dispose(); } catch (IOException) { diff --git a/SabreTools/SabreTools.cs b/SabreTools/SabreTools.cs index 847785a5..e4207781 100644 --- a/SabreTools/SabreTools.cs +++ b/SabreTools/SabreTools.cs @@ -514,6 +514,14 @@ namespace SabreTools case "--rem-sha256": stripHash |= Hash.SHA256; break; + case "-rsha384": + case "--rem-sha384": + stripHash |= Hash.SHA384; + break; + case "-rsha512": + case "--rem-sha512": + stripHash |= Hash.SHA512; + break; case "-run": case "--runnable": filter.Runnable = true;