@@ -16,6 +16,7 @@ type Decryptor struct {
1616 aead cipher.AEAD
1717 size int64
1818 offset int64
19+ phyOffset int64
1920}
2021
2122func NewDecryptor (readSeeker io.ReadSeeker , aead cipher.AEAD , encryptedSize int64 ) * Decryptor {
@@ -35,6 +36,7 @@ func NewDecryptor(readSeeker io.ReadSeeker, aead cipher.AEAD, encryptedSize int6
3536 aead : aead ,
3637 size : plainSize ,
3738 offset : 0 ,
39+ phyOffset : - 1 ,
3840 }
3941}
4042
@@ -49,14 +51,22 @@ func (d *Decryptor) Read(buf []byte) (int, error) {
4951 overhead := int64 (d .aead .Overhead ())
5052 actualChunkSize := int64 (GCMChunkSize ) + overhead
5153
52- _ , err := d .readSeeker .Seek (chunkIdx * actualChunkSize , io .SeekStart )
53- if err != nil {
54- return 0 , fmt .Errorf ("failed to seek: %w" , err )
54+ targetOffset := chunkIdx * actualChunkSize
55+
56+ if d .phyOffset != targetOffset {
57+ if _ , err := d .readSeeker .Seek (targetOffset , io .SeekStart ); err != nil {
58+ return 0 , fmt .Errorf ("failed to seek: %w" , err )
59+ }
60+ d .phyOffset = targetOffset
5561 }
5662
5763 encrypted := make ([]byte , actualChunkSize )
5864
5965 bytesRead , err := io .ReadFull (d .readSeeker , encrypted )
66+ if bytesRead > 0 {
67+ d .phyOffset += int64 (bytesRead )
68+ }
69+
6070 if err != nil && ! errors .Is (err , io .ErrUnexpectedEOF ) {
6171 return 0 , fmt .Errorf ("failed to read encrypted data: %w" , err )
6272 }
0 commit comments