Hash file with sjcl (>2Gb filesize)
This commit is contained in:
parent
78c2b560b9
commit
ba61037e42
@ -1,2 +1,3 @@
|
|||||||
BROWSER=none
|
BROWSER=none
|
||||||
HTTPS=true
|
HTTPS=true
|
||||||
|
API_HOST=https://localhost:7195
|
@ -7,6 +7,8 @@ import {ApiHost} from "../Shared/Const";
|
|||||||
import {StreamEncryption} from "../Shared/StreamEncryption";
|
import {StreamEncryption} from "../Shared/StreamEncryption";
|
||||||
import {VoidButton} from "../Shared/VoidButton";
|
import {VoidButton} from "../Shared/VoidButton";
|
||||||
import {useFileTransfer} from "../Shared/FileTransferHook";
|
import {useFileTransfer} from "../Shared/FileTransferHook";
|
||||||
|
import sjcl from "sjcl";
|
||||||
|
import {sjclcodec} from "../../codecBytes";
|
||||||
|
|
||||||
const UploadState = {
|
const UploadState = {
|
||||||
NotStarted: 0,
|
NotStarted: 0,
|
||||||
@ -99,7 +101,7 @@ export function FileUpload(props) {
|
|||||||
if (auth) {
|
if (auth) {
|
||||||
headers["Authorization"] = `Bearer ${auth}`;
|
headers["Authorization"] = `Bearer ${auth}`;
|
||||||
}
|
}
|
||||||
let req = await fetch("/upload", {
|
let req = await fetch(`${ApiHost}/upload`, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
mode: "cors",
|
mode: "cors",
|
||||||
body: rs,
|
body: rs,
|
||||||
@ -212,8 +214,17 @@ export function FileUpload(props) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function digest(file) {
|
async function digest(file) {
|
||||||
let h = await window.crypto.subtle.digest(DigestAlgo, await file.arrayBuffer());
|
const ChunkSize = 1024 * 1024;
|
||||||
return buf2hex(new Uint8Array(h));
|
// must compute hash in chunks, subtle crypto cannot hash files > 2Gb
|
||||||
|
let sha = new sjcl.hash.sha256();
|
||||||
|
for (let x = 0; x < Math.ceil(file.size / ChunkSize); x++) {
|
||||||
|
let offset = x * ChunkSize;
|
||||||
|
let slice = file.slice(offset, offset + ChunkSize);
|
||||||
|
let chunk = await slice.arrayBuffer();
|
||||||
|
sha.update(sjclcodec.toBits(new Uint8Array(chunk)));
|
||||||
|
update(chunk.byteLength);
|
||||||
|
}
|
||||||
|
return buf2hex(sjclcodec.fromBits(sha.finalize()));
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderStatus() {
|
function renderStatus() {
|
||||||
|
Loading…
Reference in New Issue
Block a user