diff --git a/client/share/cryptoUtils.js b/client/share/cryptoUtils.js new file mode 100644 index 00000000..775e341a --- /dev/null +++ b/client/share/cryptoUtils.js @@ -0,0 +1,66 @@ +import {Buffer} from 'safe-buffer'; + +//не менять +const iv = Buffer.from('B6E2XejNh2dS'); +let aesKeys = {}; + +export async function aesKeyFromPassword(password) { + return await window.crypto.subtle.importKey( + "raw", //only "raw" is allowed + Buffer.from(password), //your password + { + name: "PBKDF2", + }, + false, //whether the key is extractable (i.e. can be used in exportKey) + ["deriveKey"] //can be any combination of "deriveKey" and "deriveBits" + ).then((key) => { + return window.crypto.subtle.deriveKey( + { + "name": "PBKDF2", + salt: Buffer.from('Liberama project is awesome'),//не менять + iterations: 1000, + hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512" + }, + key, //your key from generateKey or importKey + { //the key type you want to create based on the derived bits + name: "AES-GCM", //can be any AES algorithm ("AES-CTR", "AES-CBC", "AES-CMAC", "AES-GCM", "AES-CFB", "AES-KW", "ECDH", "DH", or "HMAC") + //the generateKey parameters for that type of algorithm + length: 256, //can be 128, 192, or 256 + }, + false, //whether the derived key is extractable (i.e. can be used in exportKey) + ["encrypt", "decrypt"] //limited to the options in that algorithm's importKey + ); + }); +} + +export async function aesEncrypt(data, password) { + if (!aesKeys[password]) + aesKeys[password] = await aesKeyFromPassword(password); + + const key = aesKeys[password]; + + return await window.crypto.subtle.encrypt( + { + name: "AES-GCM", + iv + }, + key, //from generateKey or importKey above + data //ArrayBuffer of data you want to encrypt + ); +} + +export async function aesDecrypt(data, password) { + if (!aesKeys[password]) + aesKeys[password] = await aesKeyFromPassword(password); + + const key = aesKeys[password]; + + return await window.crypto.subtle.decrypt( + { + name: "AES-GCM", + iv + }, + key, //from generateKey or importKey above + data //ArrayBuffer of the data + ); +} \ No newline at end of file