|
|
@ -57,6 +57,8 @@ const extract = async (png: Buffer) => { |
|
|
|
const sneed = new PNGDecoder(reader); |
|
|
|
const ret: EmbeddedFile[] = []; |
|
|
|
let w: Buffer | undefined; |
|
|
|
if (!csettings) |
|
|
|
throw new Error("Settings uninit"); |
|
|
|
|
|
|
|
try { |
|
|
|
for await (const [name, chunk, crc, offset] of sneed.chunks()) { |
|
|
@ -103,7 +105,7 @@ const extract = async (png: Buffer) => { |
|
|
|
}).join(' '); |
|
|
|
const k = await decodeCoom3Payload(Buffer.from(decoded)); |
|
|
|
ret.push(...k.filter(e => e).map(e => e as EmbeddedFile)); |
|
|
|
} catch(e) { |
|
|
|
} catch (e) { |
|
|
|
//
|
|
|
|
} |
|
|
|
} |
|
|
@ -144,6 +146,8 @@ export const BufferWriteStream = () => { |
|
|
|
}; |
|
|
|
|
|
|
|
export const inject_data = async (container: File, injb: Buffer) => { |
|
|
|
if (!csettings) |
|
|
|
throw new Error("Settings uninit"); |
|
|
|
let magic = false; |
|
|
|
const [writestream, extract] = BufferWriteStream(); |
|
|
|
const encoder = new PNGEncoder(writestream); |
|
|
@ -154,8 +158,24 @@ export const inject_data = async (container: File, injb: Buffer) => { |
|
|
|
break; |
|
|
|
if (!magic && name == "IDAT") { |
|
|
|
const passed = Buffer.from(injb); |
|
|
|
//xor(passed, password2);
|
|
|
|
await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); |
|
|
|
switch (csettings.pmeth) { |
|
|
|
case 0: |
|
|
|
await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM3, passed])), () => Promise.resolve(0), 0]); |
|
|
|
break; |
|
|
|
case 1: |
|
|
|
xor(passed, password); |
|
|
|
await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM4, Buffer.from(Buffer.from(passed).toString("base64"))])), () => Promise.resolve(0), 0]); |
|
|
|
break; |
|
|
|
case 2: |
|
|
|
await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM5, Buffer.from(Buffer.from(passed).toString("base64"))])), () => Promise.resolve(0), 0]); |
|
|
|
break; |
|
|
|
case 3: |
|
|
|
await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM6, Buffer.from(Buffer.from(passed).toString("base64"))])), () => Promise.resolve(0), 0]); |
|
|
|
break; |
|
|
|
case 4: |
|
|
|
await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", Buffer.concat([CUM7, Buffer.from(bs58.encode(passed))])), () => Promise.resolve(0), 0]); |
|
|
|
break; |
|
|
|
} |
|
|
|
magic = true; |
|
|
|
} |
|
|
|
await encoder.insertchunk([name, chunk, crc, offset]); |
|
|
@ -178,7 +198,7 @@ const inject = async (container: File, links: string[]) => { |
|
|
|
} |
|
|
|
return ''; |
|
|
|
}); |
|
|
|
const injb = Buffer.from(bs58.encode(Buffer.from(links.join(' ')))); |
|
|
|
const injb = Buffer.from(links.join(' ')); |
|
|
|
return inject_data(container, injb); |
|
|
|
}; |
|
|
|
|
|
|
|