@@ -170,7 +170,7 @@ public override void SetLength(long value)
170170 if ( value == Length )
171171 return ;
172172
173- // Make sure header is ready before we can read/modify chunks
173+ // Make sure the header is ready before we can read/modify chunks
174174 if ( ! TryWriteHeader ( ) && ! _headerBuffer . ReadHeader ( Inner , _security ) )
175175 throw new CryptographicException ( ) ;
176176
@@ -191,7 +191,7 @@ public override void SetLength(long value)
191191 }
192192 else if ( value > Length )
193193 {
194- // Flush remaining chunks before base stream is accessed
194+ // Flush remaining chunks before the base stream is accessed
195195 _chunkAccess . Flush ( ) ;
196196
197197 // Calculate plaintext size here because plaintext Length might not be initialized yet
@@ -259,6 +259,9 @@ public override void Close()
259259 /// <inheritdoc/>
260260 public override void Flush ( )
261261 {
262+ if ( ! CanWrite )
263+ throw FileSystemExceptions . StreamReadOnly ;
264+
262265 // Only flush when there's a need to
263266 if ( _chunkAccess . FlushAvailable )
264267 {
@@ -270,7 +273,7 @@ public override void Flush()
270273 private void WriteInternal ( ReadOnlySpan < byte > buffer , long position )
271274 {
272275 if ( ! TryWriteHeader ( ) && ! _headerBuffer . ReadHeader ( Inner , _security ) )
273- throw new CryptographicException ( ) ;
276+ throw new CryptographicException ( "Could not write nor read the header." ) ;
274277
275278 var plaintextChunkSize = _security . ContentCrypt . ChunkPlaintextSize ;
276279 var written = 0 ;
@@ -282,7 +285,6 @@ private void WriteInternal(ReadOnlySpan<byte> buffer, long position)
282285 var chunkNumber = currentPosition / plaintextChunkSize ;
283286 var offsetInChunk = ( int ) ( currentPosition % plaintextChunkSize ) ;
284287 var length = Math . Min ( buffer . Length - positionInBuffer , plaintextChunkSize - offsetInChunk ) ;
285-
286288 var copy = _chunkAccess . CopyToChunk (
287289 chunkNumber ,
288290 buffer . Slice ( positionInBuffer ) ,
@@ -309,43 +311,40 @@ private void WriteInternal(ReadOnlySpan<byte> buffer, long position)
309311 [ SkipLocalsInit ]
310312 private bool TryWriteHeader ( )
311313 {
312- if ( ! CanWrite )
313- throw FileSystemExceptions . StreamReadOnly ;
314+ if ( _headerBuffer . IsHeaderReady )
315+ return true ;
314316
315317 lock ( _writeLock )
316- if ( ! _headerBuffer . IsHeaderReady && CanWrite )
318+ {
319+ // Check if there is data already written only when we can seek
320+ if ( Inner . Length > 0L )
321+ return false ;
322+
323+ // Make sure we save the header state
324+ _headerBuffer . IsHeaderReady = true ;
325+
326+ // Allocate ciphertext header
327+ Span < byte > ciphertextHeader = stackalloc byte [ _security . HeaderCrypt . HeaderCiphertextSize ] ;
328+
329+ // Get and encrypt the header
330+ _security . HeaderCrypt . CreateHeader ( _headerBuffer ) ;
331+ _security . HeaderCrypt . EncryptHeader ( _headerBuffer , ciphertextHeader ) ;
332+
333+ // Write header
334+ if ( CanSeek )
317335 {
318- // Check if there is data already written only when we can seek
319- if ( Inner . Length > 0L )
320- return false ;
321-
322- // Make sure we save the header state
323- _headerBuffer . IsHeaderReady = true ;
324-
325- // Allocate ciphertext header
326- Span < byte > ciphertextHeader = stackalloc byte [ _security . HeaderCrypt . HeaderCiphertextSize ] ;
327-
328- // Get and encrypt the header
329- _security . HeaderCrypt . CreateHeader ( _headerBuffer ) ;
330- _security . HeaderCrypt . EncryptHeader ( _headerBuffer , ciphertextHeader ) ;
331-
332- // Write header
333- if ( CanSeek )
334- {
335- var savedPosition = Inner . Position ;
336- Inner . Position = 0L ;
337- Inner . Write ( ciphertextHeader ) ;
338- Inner . Position = savedPosition + ciphertextHeader . Length ;
339- }
340- else
341- {
342- Inner . Write ( ciphertextHeader ) ;
343- }
344-
345- return true ;
336+ var savedPosition = Inner . Position ;
337+ Inner . Position = 0L ;
338+ Inner . Write ( ciphertextHeader ) ;
339+ Inner . Position = savedPosition + ciphertextHeader . Length ;
340+ }
341+ else
342+ {
343+ Inner . Write ( ciphertextHeader ) ;
346344 }
347345
348- return false ;
346+ return true ;
347+ }
349348 }
350349
351350 private long AlignToChunkStartPosition ( long plaintextPosition )
0 commit comments