Skip to content

Commit e6e046d

Browse files
committed
feat: implement encryptStreamInParts method for chunked encryption of readable streams
1 parent 59f278b commit e6e046d

2 files changed

Lines changed: 19 additions & 5 deletions

File tree

src/services/crypto.service.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { CryptoProvider } from '@internxt/sdk';
22
import { Keys, Password } from '@internxt/sdk/dist/auth';
33
import { createCipheriv, createDecipheriv, createHash, Decipher, pbkdf2Sync, randomBytes } from 'node:crypto';
4-
import { Transform } from 'node:stream';
4+
import { Readable, Transform } from 'node:stream';
55
import { KeysService } from './keys.service';
66
import { ConfigService } from '../services/config.service';
77
import { StreamUtils } from '../utils/stream.utils';
@@ -116,12 +116,26 @@ export class CryptoService {
116116
return Buffer.concat([decipher.update(contentsToDecrypt), decipher.final()]).toString('utf8');
117117
};
118118

119-
public async decryptStream(
119+
public encryptStreamInParts = (
120+
readable: Readable,
121+
cipher: Transform,
122+
size: number,
123+
parts: number,
124+
): Transform => {
125+
// We include a marginChunkSize because if we split the chunk directly, there will always be one more chunk left, this will cause a mismatch with the urls provided
126+
const marginChunkSize = 1024;
127+
const chunkSize = size / parts + marginChunkSize;
128+
const readableChunks = StreamUtils.streamReadableIntoChunks(readable, chunkSize);
129+
130+
return readableChunks.pipe(cipher);
131+
};
132+
133+
public decryptStream = (
120134
inputSlices: ReadableStream<Uint8Array>[],
121135
key: Buffer,
122136
iv: Buffer,
123137
startOffsetByte?: number,
124-
) {
138+
) => {
125139
let decipher: Decipher;
126140
if (startOffsetByte) {
127141
const aesBlockSize = 16;
@@ -164,7 +178,7 @@ export class CryptoService {
164178
});
165179

166180
return decryptedStream;
167-
}
181+
};
168182

169183
public getEncryptionTransform = (key: Buffer, iv: Buffer): Transform => {
170184
const cipher = createCipheriv('aes-256-ctr', key, iv);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export class NetworkFacade {
7373
if (rangeOptions) {
7474
startOffsetByte = rangeOptions.parsed.start;
7575
}
76-
fileStream = await this.cryptoService.decryptStream(
76+
fileStream = this.cryptoService.decryptStream(
7777
encryptedContentStreams,
7878
Buffer.from(key as ArrayBuffer),
7979
Buffer.from(iv as ArrayBuffer),

0 commit comments

Comments
 (0)