Skip to content

Commit 0bb6d2c

Browse files
committed
added optional skip buffer for decrypting only a part of a file
1 parent 0c4322f commit 0bb6d2c

2 files changed

Lines changed: 15 additions & 1 deletion

File tree

src/services/crypto.service.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,17 @@ export class CryptoService {
116116
return Buffer.concat([decipher.update(contentsToDecrypt), decipher.final()]).toString('utf8');
117117
};
118118

119-
public async decryptStream(inputSlices: ReadableStream<Uint8Array>[], key: Buffer, iv: Buffer) {
119+
public async decryptStream(
120+
inputSlices: ReadableStream<Uint8Array>[],
121+
key: Buffer,
122+
iv: Buffer,
123+
skipOptions?: { total: number },
124+
) {
120125
const decipher = createDecipheriv('aes-256-ctr', key, iv);
126+
if (skipOptions) {
127+
const skipBuffer = Buffer.alloc(skipOptions.total, 0);
128+
decipher.update(skipBuffer);
129+
}
121130
const encryptedStream = StreamUtils.joinReadableBinaryStreams(inputSlices);
122131

123132
let keepReading = true;

src/services/network/network-facade.service.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,15 @@ export class NetworkFacade {
7272
};
7373

7474
const decryptFile: DecryptFileFunction = async (_, key, iv) => {
75+
let skipOptions;
76+
if (rangeOptions) {
77+
skipOptions = { total: rangeOptions.parsed.start };
78+
}
7579
fileStream = await this.cryptoService.decryptStream(
7680
encryptedContentStreams,
7781
Buffer.from(key as ArrayBuffer),
7882
Buffer.from(iv as ArrayBuffer),
83+
skipOptions,
7984
);
8085

8186
await fileStream.pipeTo(to);

0 commit comments

Comments
 (0)