( arrBuf: ArrayBuffer, password: string, rounds: number = DEFAULT_ITER, saltHex = "" )
| 36 | }; |
| 37 | |
| 38 | export const encryptArrayBuffer = async ( |
| 39 | arrBuf: ArrayBuffer, |
| 40 | password: string, |
| 41 | rounds: number = DEFAULT_ITER, |
| 42 | saltHex = "" |
| 43 | ) => { |
| 44 | let salt: Uint8Array; |
| 45 | if (saltHex !== "") { |
| 46 | salt = hexStringToTypedArray(saltHex); |
| 47 | } else { |
| 48 | salt = window.crypto.getRandomValues(new Uint8Array(8)); |
| 49 | } |
| 50 | |
| 51 | const derivedKey = await getKeyIVFromPassword(salt, password, rounds); |
| 52 | const key = derivedKey.slice(0, 32); |
| 53 | const iv = derivedKey.slice(32, 32 + 16); |
| 54 | |
| 55 | const keyCrypt = await window.crypto.subtle.importKey( |
| 56 | "raw", |
| 57 | key, |
| 58 | { name: "AES-CBC" }, |
| 59 | false, |
| 60 | ["encrypt", "decrypt"] |
| 61 | ); |
| 62 | |
| 63 | const enc = (await window.crypto.subtle.encrypt( |
| 64 | { name: "AES-CBC", iv }, |
| 65 | keyCrypt, |
| 66 | arrBuf |
| 67 | )) as ArrayBuffer; |
| 68 | |
| 69 | const prefix = new TextEncoder().encode("Salted__"); |
| 70 | |
| 71 | const res = new Uint8Array([...prefix, ...salt, ...new Uint8Array(enc)]); |
| 72 | |
| 73 | return bufferToArrayBuffer(res); |
| 74 | }; |
| 75 | |
| 76 | export const decryptArrayBuffer = async ( |
| 77 | arrBuf: ArrayBuffer, |
no test coverage detected