/// <summary> /// Creates a new <see cref="AesXtsFile"/> using the provided key. /// </summary> /// <param name="path">The full path of the file to create.</param> /// <param name="size">The initial size of the created file.</param> /// <param name="options">Flags to control how the file is created. /// Should usually be <see cref="CreateFileOptions.None"/></param> /// <param name="key">The 256-bit key containing a 128-bit data key followed by a 128-bit tweak key.</param> public Result CreateFile(U8Span path, long size, CreateFileOptions options, byte[] key) { long containerSize = AesXtsFile.HeaderLength + Utilities.AlignUp(size, 0x10); Result rc = BaseFileSystem.CreateFile(path, containerSize, options); if (rc.IsFailure()) { return(rc); } var header = new AesXtsFileHeader(key, size, path.ToString(), KekSource, ValidationKey); rc = BaseFileSystem.OpenFile(out IFile baseFile, path, OpenMode.Write); if (rc.IsFailure()) { return(rc); } using (baseFile) { rc = baseFile.Write(0, header.ToBytes(false)); if (rc.IsFailure()) { return(rc); } } return(Result.Success); }
private void WriteXtsHeader(AesXtsFileHeader header, string filePath, string keyPath) { Debug.Assert(PathTools.IsNormalized(filePath.AsSpan())); Debug.Assert(PathTools.IsNormalized(keyPath.AsSpan())); header.EncryptHeader(keyPath, KekSource, ValidationKey); BaseFileSystem.OpenFile(out IFile file, filePath.ToU8Span(), OpenMode.ReadWrite); using (file) { file.Write(0, header.ToBytes(false), WriteOption.Flush).ThrowIfFailure(); } }