diff --git a/src/encrypt.ts b/src/encrypt.ts index 652f3b2..1be4cc2 100644 --- a/src/encrypt.ts +++ b/src/encrypt.ts @@ -165,3 +165,23 @@ export const decryptBase64urlToString = async ( ) ); }; + +export const getSizeFromOrigToEnc = (x: number) => { + if (x < 0 || !Number.isInteger(x)) { + throw Error(`x=${x} is not a valid size`); + } + return (Math.floor(x / 16) + 1) * 16 + 16; +}; + +export const getSizeFromEncToOrig = (x: number) => { + if (x < 32 || !Number.isInteger(x)) { + throw Error(`${x} is not a valid size`); + } + if (x % 16 !== 0) { + throw Error(`${x} is not a valid encrypted file size`); + } + return { + minSize: ((x - 16) / 16 - 1) * 16, + maxSize: ((x - 16) / 16 - 1) * 16 + 15, + }; +}; diff --git a/tests/encrypt.test.ts b/tests/encrypt.test.ts index b5f1866..8a4dc4f 100644 --- a/tests/encrypt.test.ts +++ b/tests/encrypt.test.ts @@ -8,6 +8,8 @@ import { encryptArrayBuffer, encryptStringToBase32, encryptStringToBase64url, + getSizeFromEncToOrig, + getSizeFromOrigToEnc, } from "../src/encrypt"; import { base64ToBase64url, bufferToArrayBuffer } from "../src/misc"; @@ -110,4 +112,34 @@ describe("Encryption tests", () => { expect(Buffer.from(dec).equals(Buffer.from(opensslArrBuf))).to.be.true; }); + + it("should get size from origin to encrypted correctly", () => { + expect(() => getSizeFromOrigToEnc(-1)).to.throw(); + expect(() => getSizeFromOrigToEnc(0.5)).to.throw(); + expect(getSizeFromOrigToEnc(0)).equals(32); + expect(getSizeFromOrigToEnc(15)).equals(32); + expect(getSizeFromOrigToEnc(16)).equals(48); + expect(getSizeFromOrigToEnc(31)).equals(48); + expect(getSizeFromOrigToEnc(32)).equals(64); + expect(getSizeFromOrigToEnc(14787203)).equals(14787232); + }); + + it("should get size from encrypted to origin correctly", () => { + expect(() => getSizeFromEncToOrig(-1)).to.throw(); + expect(() => getSizeFromEncToOrig(30)).to.throw(); + + expect(getSizeFromEncToOrig(32)).to.deep.equal({ + minSize: 0, + maxSize: 15, + }); + expect(getSizeFromEncToOrig(48)).to.deep.equal({ + minSize: 16, + maxSize: 31, + }); + + expect(() => getSizeFromEncToOrig(14787231)).to.throw(); + + let { minSize, maxSize } = getSizeFromEncToOrig(14787232); + expect(minSize <= 14787203 && 14787203 <= maxSize).to.be.true; + }); });