diff --git a/packages/linejs/base/e2ee/mod.ts b/packages/linejs/base/e2ee/mod.ts index 0a86f76..e966ac5 100644 --- a/packages/linejs/base/e2ee/mod.ts +++ b/packages/linejs/base/e2ee/mod.ts @@ -1034,21 +1034,26 @@ export class E2EE { nonce: Buffer, data: Buffer, ): Promise { + // Convert ArrayBufferLike to ArrayBuffer + const nonceArrayBuffer = nonce.buffer.slice(nonce.byteOffset, nonce.byteOffset + nonce.byteLength); + const aesKeyArrayBuffer = aesKey.buffer.slice(aesKey.byteOffset, aesKey.byteOffset + aesKey.byteLength); + const dataArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength); + return Buffer.from( await globalThis.crypto.subtle.encrypt( { name: "AES-CTR", - counter: nonce, + counter: new Uint8Array(nonceArrayBuffer as ArrayBuffer), length: 64, }, await globalThis.crypto.subtle.importKey( "raw", - aesKey, + new Uint8Array(aesKeyArrayBuffer as ArrayBuffer), "AES-CTR", false, ["encrypt", "decrypt"], ), - data, + new Uint8Array(dataArrayBuffer as ArrayBuffer), ), ); } diff --git a/packages/linejs/base/obs/mod.ts b/packages/linejs/base/obs/mod.ts index 708e716..8b3d14a 100644 --- a/packages/linejs/base/obs/mod.ts +++ b/packages/linejs/base/obs/mod.ts @@ -185,7 +185,7 @@ export class LineObs { ...oid ? { oid: oid } : { oid: "reqseq", tomid: to, - reqseq: this.client.getReqseq("talk").toString(), + reqseq: (await this.client.getReqseq("talk")).toString(), }, }; if (type === "image") { @@ -202,7 +202,7 @@ export class LineObs { return await this.uploadObjectForService({ data, oType: type, - obsPath: toType + "/m/" + oid || "reqseq", + obsPath: `${toType}/m/${oid ?? "reqseq"}`, filename: param.name, params: param, }); @@ -241,13 +241,13 @@ export class LineObs { }; params = { ...baseParams, ...(params || {}) }; - + if (!data || data.size === 0) { throw new InternalError("ObsError", "No data to send."); } let headers: Record = this.client.request .getHeader("POST"); - headers["Content-Type"] = "application/octet-stream"; + headers["content-type"] = "application/octet-stream"; headers["X-Obs-Params"] = Buffer.from(JSON.stringify(params)).toString( "base64", ); @@ -331,7 +331,8 @@ export class LineObs { Buffer.from(await data.arrayBuffer()), ); const tempId = "reqid-" + crypto.randomUUID(); - const edata = new Blob([encryptedData]); + const encryptedArrayBuffer = encryptedData.buffer.slice(encryptedData.byteOffset, encryptedData.byteOffset + encryptedData.byteLength); + const edata = new Blob([new Uint8Array(encryptedArrayBuffer as ArrayBuffer)]); const { objId } = await this.uploadObjectForService({ data: edata, oType: "file", @@ -407,11 +408,13 @@ export class LineObs { obsPath: "talk/" + contentMetadata.SID, addHeaders: { "X-Talk-Meta": talkMeta }, }); + const decryptedBuffer = await this.client.e2ee.decryptByKeyMaterial( + Buffer.from(await data.arrayBuffer()), + keyMaterial, + ); + const decryptedArrayBuffer = decryptedBuffer.buffer.slice(decryptedBuffer.byteOffset, decryptedBuffer.byteOffset + decryptedBuffer.byteLength); const fileData = new File([ - await this.client.e2ee.decryptByKeyMaterial( - Buffer.from(await data.arrayBuffer()), - keyMaterial, - ), + new Uint8Array(decryptedArrayBuffer as ArrayBuffer), ], fileName); return fileData; } diff --git a/packages/linejs/base/request/mod.ts b/packages/linejs/base/request/mod.ts index 0a28767..ee7a5da 100644 --- a/packages/linejs/base/request/mod.ts +++ b/packages/linejs/base/request/mod.ts @@ -140,13 +140,14 @@ export class RequestClient { body: Trequest, }); + const requestArrayBuffer = Trequest.buffer.slice(Trequest.byteOffset, Trequest.byteOffset + Trequest.byteLength); const response = await this.client.fetch( `https://${this.endpoint}${path}`, { method: overrideMethod, headers, signal: AbortSignal.timeout(timeout), - body: Trequest, + body: new Uint8Array(requestArrayBuffer as ArrayBuffer), }, ); const nextToken = response.headers.get("x-line-next-access");