Skip to content

Commit d17c486

Browse files
committed
improved skipBuffer by calculating IV instead of using all starting aes blocks
1 parent 46a12cd commit d17c486

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

src/services/crypto.service.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { CryptoProvider } from '@internxt/sdk';
22
import { Keys, Password } from '@internxt/sdk/dist/auth';
3-
import { createCipheriv, createDecipheriv, createHash, pbkdf2Sync, randomBytes } from 'node:crypto';
3+
import { createCipheriv, createDecipheriv, createHash, Decipher, pbkdf2Sync, randomBytes } from 'node:crypto';
44
import { Transform } from 'node:stream';
55
import { KeysService } from './keys.service';
66
import { ConfigService } from '../services/config.service';
@@ -120,12 +120,24 @@ export class CryptoService {
120120
inputSlices: ReadableStream<Uint8Array>[],
121121
key: Buffer,
122122
iv: Buffer,
123-
skipOptions?: { total: number },
123+
startOffsetByte?: number,
124124
) {
125-
const decipher = createDecipheriv('aes-256-ctr', key, iv);
126-
if (skipOptions) {
127-
const skipBuffer = Buffer.alloc(skipOptions.total, 0);
125+
let decipher: Decipher;
126+
if (startOffsetByte) {
127+
const aesBlockSize = 16;
128+
const startOffset = startOffsetByte % aesBlockSize;
129+
const startBlockFirstByte = startOffsetByte - startOffset;
130+
const startBlockNumber = startBlockFirstByte / aesBlockSize;
131+
132+
const ivForRange = (BigInt('0x' + iv.toString('hex')) + BigInt(startBlockNumber)).toString(16).padStart(32, '0');
133+
const newIv = Buffer.from(ivForRange, 'hex');
134+
135+
const skipBuffer = Buffer.alloc(startOffset, 0);
136+
137+
decipher = createDecipheriv('aes-256-ctr', key, newIv);
128138
decipher.update(skipBuffer);
139+
} else {
140+
decipher = createDecipheriv('aes-256-ctr', key, iv);
129141
}
130142
const encryptedStream = StreamUtils.joinReadableBinaryStreams(inputSlices);
131143

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

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

7474
const decryptFile: DecryptFileFunction = async (_, key, iv) => {
75-
let skipOptions;
75+
let startOffsetByte;
7676
if (rangeOptions) {
77-
skipOptions = { total: rangeOptions.parsed.start };
77+
startOffsetByte = rangeOptions.parsed.start;
7878
}
7979
fileStream = await this.cryptoService.decryptStream(
8080
encryptedContentStreams,
8181
Buffer.from(key as ArrayBuffer),
8282
Buffer.from(iv as ArrayBuffer),
83-
skipOptions,
83+
startOffsetByte,
8484
);
8585

8686
await fileStream.pipeTo(to);

0 commit comments

Comments
 (0)