Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / keys / keys.ts
blob1afb9c55816a6c8adfe64848360ca498683422e9
1 import type { KeyReference, PrivateKeyReference, PublicKeyReference } from '@proton/crypto';
2 import { CryptoProxy } from '@proton/crypto';
3 import { computeKeyPassword, generateKeySalt } from '@proton/srp';
5 import { extractEmailFromUserID } from '../helpers/email';
6 import type { Key, KeyPair, KeySalt as tsKeySalt } from '../interfaces';
8 export const generateKeySaltAndPassphrase = async (password: string) => {
9     const salt = generateKeySalt();
10     return {
11         salt,
12         passphrase: await computeKeyPassword(password, salt),
13     };
16 /**
17  * Given a list of keys and joining key salts, get the primary key and the corresponding key salt.
18  * @param Keys - Keys as received from the API
19  * @param KeySalts - KeySalts as received from the API
20  */
21 export const getPrimaryKeyWithSalt = (Keys: Key[] = [], KeySalts: tsKeySalt[] = []) => {
22     const [{ ID, PrivateKey } = { ID: '', PrivateKey: '' }] = Keys;
23     const { KeySalt } = KeySalts.find(({ ID: keySaltID }) => ID === keySaltID) || {};
25     // Not verifying that KeySalt exists because of old auth versions.
26     return {
27         PrivateKey,
28         KeySalt,
29     };
32 export const splitKeys = (keys: Partial<KeyPair>[] = []) => {
33     return keys.reduce<{ privateKeys: PrivateKeyReference[]; publicKeys: PublicKeyReference[] }>(
34         (acc, { privateKey, publicKey }) => {
35             if (!privateKey || !publicKey) {
36                 return acc;
37             }
38             acc.publicKeys.push(publicKey);
39             acc.privateKeys.push(privateKey);
40             return acc;
41         },
42         { publicKeys: [], privateKeys: [] }
43     );
46 export const decryptPrivateKeyWithSalt = async ({
47     password,
48     keySalt,
49     PrivateKey,
50 }: {
51     password: string;
52     keySalt?: string;
53     PrivateKey: string;
54 }) => {
55     const keyPassword = keySalt ? await computeKeyPassword(password, keySalt) : password;
56     return CryptoProxy.importPrivateKey({ armoredKey: PrivateKey, passphrase: keyPassword });
59 export const getEmailFromKey = (key: KeyReference) => {
60     const [userID] = key.getUserIDs();
61     return extractEmailFromUserID(userID);