add password prompt to ZK viewer for wrapped uploads

This commit is contained in:
2026-10-26 20:06:54 +01:00
parent 112aa99f1e
commit dc8e576679
2 changed files with 92 additions and 5 deletions
+33 -2
View File
@@ -4,6 +4,7 @@ import { api } from '@/plugins/axios';
import type { GetZkUploadCiphertextResult } from '@/types/upload/GetZkUploadCiphertextResult';
import { base64ToBytes } from '@/utils/encoding/base64ToBytes';
import { toArrayBuffer } from '@/utils/toArrayBuffer';
import { decryptPasswordProtectedZkUpload } from '@/utils/upload/decryptPasswordProtectedZkUpload';
import { decryptZkUpload } from '@/utils/upload/decryptZkUpload';
export const useViewStore = defineStore('view', () => {
@@ -22,13 +23,43 @@ export const useViewStore = defineStore('view', () => {
return data;
};
const loadZk = async (payload: GetZkUploadCiphertextResult, fragmentKey: string): Promise<void> => {
const loadZk = async (
payload: GetZkUploadCiphertextResult,
fragmentKey: string,
password?: string
): Promise<void> => {
clearImage();
const iv = base64ToBytes(payload.iv);
const ciphertext = base64ToBytes(payload.ciphertext);
const plaintext = await decryptZkUpload(ciphertext, iv, fragmentKey);
let plaintext: Uint8Array;
if (payload.passwordProtected) {
if (!password) {
throw new Error('Password required');
}
if (!payload.wrappedDek || !payload.wrapIv || !payload.salt) {
throw new Error('Incomplete password protection data');
}
const wrappedDek = base64ToBytes(payload.wrappedDek);
const wrapIv = base64ToBytes(payload.wrapIv);
const salt = base64ToBytes(payload.salt);
plaintext = await decryptPasswordProtectedZkUpload(
ciphertext,
iv,
fragmentKey,
password,
wrappedDek,
wrapIv,
salt
);
} else {
plaintext = await decryptZkUpload(ciphertext, iv, fragmentKey);
}
const buffer = toArrayBuffer(plaintext);