public static void BuildChecksum(Storage storage, string filePath) { var header = GetHeader(storage, filePath); var name = Path.GetFileName(filePath); var checksum = new ChecksumInfo(); using (var stream = storage.FileReadStream(filePath + ".header")) { checksum.Add("header", Hash.Generate(HashTypes.Sha512, stream)); } using (var stream = storage.FileReadStream(filePath + ".data")) { checksum.Add("data", Hash.Generate(HashTypes.Sha512, stream)); } if (header.Flags.HasFlag(DiscStorageFlags.SortedDynamicIndex) || header.Flags.HasFlag(DiscStorageFlags.UnsortedDynamicIndex)) { using (var stream = storage.FileReadStream(filePath + ".lookup")) { checksum.Add("lookup", Hash.Generate(HashTypes.Sha512, stream)); } } storage.WriteFileBytes(filePath + ".checksums", checksum.ToArray()); }
public static CheckDiscStorageResult CheckDiscStorage(Storage _storage, string path) { var checksumData = _storage.ReadFileBytes(path + ".checksums"); if (checksumData != null) { var checksum = new ChecksumInfo(checksumData); var error = false; using (var headerStream = _storage.FileReadStream(path + ".header")) { var valid = checksum.Valid("header", headerStream); if (!valid) { error = true; } } using (var headerStream = _storage.FileReadStream(path + ".data")) { var valid = checksum.Valid("data", headerStream); if (!valid) { error = true; } } if (checksum.Get("lookup") != null) { using (var headerStream = _storage.FileReadStream(path + ".lookup")) { var valid = checksum.Valid("lookup", headerStream); if (!valid) { error = true; } } } if (error) { return(CheckDiscStorageResult.CheckumFailed); } } else { var error = false; var header = GetHeader(_storage, path); if (header == null) { return(CheckDiscStorageResult.HeaderNotFound); } using (var storage = new DiscStorage(_storage, path, header.BlockSize, header.UserData.Length, header.Flags | DiscStorageFlags.Readonly)) { for (var i = storage.StartIndex; i <= storage.EndIndex; i++) { if (!storage.BlockDataCrcValidRawIndex(i)) { error = true; break; } } } if (error) { return(CheckDiscStorageResult.DataCrcError); } return(CheckDiscStorageResult.MissingChecksum); } return(CheckDiscStorageResult.Ok); }