2021-04-05 05:38:42 +00:00
|
|
|
import React, { useState, useEffect, useContext } from 'react';
|
|
|
|
import constants from 'utils/strings/constants';
|
2021-04-05 06:17:31 +00:00
|
|
|
import { getData, LS_KEYS } from 'utils/storage/localStorage';
|
2021-04-05 05:38:42 +00:00
|
|
|
import { useRouter } from 'next/router';
|
|
|
|
import { getKey, SESSION_KEYS, setKey } from 'utils/storage/sessionStorage';
|
|
|
|
import { B64EncryptionResult } from 'services/uploadService';
|
2021-04-05 05:44:56 +00:00
|
|
|
import CryptoWorker, {
|
|
|
|
setSessionKeys,
|
2021-04-05 05:50:40 +00:00
|
|
|
generateAndSaveIntermediateKeyAttributes,
|
2021-04-05 05:44:56 +00:00
|
|
|
} from 'utils/crypto';
|
2021-04-05 05:38:42 +00:00
|
|
|
import { getActualKey } from 'utils/common/key';
|
2021-04-05 06:17:31 +00:00
|
|
|
import { logoutUser, setKeys, UpdatedKey } from 'services/userService';
|
|
|
|
import PasswordForm from 'components/PasswordForm';
|
2021-04-05 05:38:42 +00:00
|
|
|
|
|
|
|
export interface KEK {
|
|
|
|
key: string;
|
|
|
|
opsLimit: number;
|
|
|
|
memLimit: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
export default function Generate() {
|
|
|
|
const [token, setToken] = useState<string>();
|
|
|
|
const router = useRouter();
|
|
|
|
const key = getKey(SESSION_KEYS.ENCRYPTION_KEY);
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
const user = getData(LS_KEYS.USER);
|
|
|
|
if (!user?.token) {
|
|
|
|
router.push('/');
|
|
|
|
} else {
|
|
|
|
setToken(user.token);
|
|
|
|
}
|
|
|
|
}, []);
|
|
|
|
|
2021-04-05 06:17:31 +00:00
|
|
|
const onSubmit = async (passphrase, setFieldError) => {
|
|
|
|
const cryptoWorker = await new CryptoWorker();
|
|
|
|
const key: string = await getActualKey();
|
|
|
|
const keyAttributes = getData(LS_KEYS.KEY_ATTRIBUTES);
|
|
|
|
const kekSalt: string = await cryptoWorker.generateSaltToDeriveKey();
|
|
|
|
let kek: KEK;
|
2021-04-05 05:38:42 +00:00
|
|
|
try {
|
2021-04-05 06:17:31 +00:00
|
|
|
kek = await cryptoWorker.deriveSensitiveKey(passphrase, kekSalt);
|
|
|
|
} catch (e) {
|
|
|
|
setFieldError('confirm', constants.PASSWORD_GENERATION_FAILED);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const encryptedKeyAttributes: B64EncryptionResult = await cryptoWorker.encryptToB64(
|
|
|
|
key,
|
|
|
|
kek.key
|
|
|
|
);
|
|
|
|
const updatedKey: UpdatedKey = {
|
|
|
|
kekSalt,
|
|
|
|
encryptedKey: encryptedKeyAttributes.encryptedData,
|
|
|
|
keyDecryptionNonce: encryptedKeyAttributes.nonce,
|
|
|
|
opsLimit: kek.opsLimit,
|
|
|
|
memLimit: kek.memLimit,
|
|
|
|
};
|
2021-04-05 05:38:42 +00:00
|
|
|
|
2021-04-05 06:17:31 +00:00
|
|
|
await setKeys(token, updatedKey);
|
2021-04-05 05:38:42 +00:00
|
|
|
|
2021-04-05 06:17:31 +00:00
|
|
|
const updatedKeyAttributes = Object.assign(keyAttributes, updatedKey);
|
|
|
|
await generateAndSaveIntermediateKeyAttributes(
|
|
|
|
passphrase,
|
|
|
|
updatedKeyAttributes,
|
|
|
|
key
|
|
|
|
);
|
2021-04-05 05:38:42 +00:00
|
|
|
|
2021-04-05 06:17:31 +00:00
|
|
|
setSessionKeys(key);
|
|
|
|
router.push('/gallery');
|
2021-04-05 05:38:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
2021-04-05 06:17:31 +00:00
|
|
|
<PasswordForm
|
|
|
|
callback={onSubmit}
|
|
|
|
buttonText={constants.CHANGE_PASSWORD}
|
2021-04-05 06:35:58 +00:00
|
|
|
back={() => router.push('/gallery')}
|
2021-04-05 06:17:31 +00:00
|
|
|
/>
|
2021-04-05 05:38:42 +00:00
|
|
|
);
|
|
|
|
}
|