-
Notifications
You must be signed in to change notification settings - Fork 5.1k
/
Copy pathencryptor-factory.ts
122 lines (117 loc) · 3.51 KB
/
encryptor-factory.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import {
encrypt,
encryptWithDetail,
encryptWithKey,
decrypt,
decryptWithDetail,
decryptWithKey,
isVaultUpdated,
keyFromPassword,
importKey,
exportKey,
generateSalt,
EncryptionKey,
KeyDerivationOptions,
} from '@metamask/browser-passworder';
/**
* A factory function for the encrypt method of the browser-passworder library,
* that encrypts with a given number of iterations.
*
* @param iterations - The number of iterations to use for the PBKDF2 algorithm.
* @returns A function that encrypts with the given number of iterations.
*/
const encryptFactory =
(iterations: number) =>
async (
password: string,
data: unknown,
key?: EncryptionKey | CryptoKey,
salt?: string,
) =>
encrypt(password, data, key, salt, {
algorithm: 'PBKDF2',
params: {
iterations,
},
});
/**
* A factory function for the encryptWithDetail method of the browser-passworder library,
* that encrypts with a given number of iterations.
*
* @param iterations - The number of iterations to use for the PBKDF2 algorithm.
* @returns A function that encrypts with the given number of iterations.
*/
const encryptWithDetailFactory =
(iterations: number) =>
async (password: string, object: unknown, salt?: string) =>
encryptWithDetail(password, object, salt, {
algorithm: 'PBKDF2',
params: {
iterations,
},
});
/**
* A factory function for the keyFromPassword method of the browser-passworder library,
* that generates a key from a password and a salt.
*
* This factory function overrides the default key derivation options with the specified
* number of iterations, unless existing key derivation options are passed in.
*
* @param iterations - The number of iterations to use for the PBKDF2 algorithm.
* @returns A function that generates a key with a potentially overriden number of iterations.
*/
const keyFromPasswordFactory =
(iterations: number) =>
async (
password: string,
salt: string,
exportable?: boolean,
opts?: KeyDerivationOptions,
) =>
keyFromPassword(
password,
salt,
exportable,
opts ?? {
algorithm: 'PBKDF2',
params: {
iterations,
},
},
);
/**
* A factory function for the isVaultUpdated method of the browser-passworder library,
* that checks if the given vault was encrypted with the given number of iterations.
*
* @param iterations - The number of iterations to use for the PBKDF2 algorithm.
* @returns A function that checks if the vault was encrypted with the given number of iterations.
*/
const isVaultUpdatedFactory = (iterations: number) => (vault: string) =>
isVaultUpdated(vault, {
algorithm: 'PBKDF2',
params: {
iterations,
},
});
/**
* A factory function that returns an encryptor with the given number of iterations.
*
* The returned encryptor is a wrapper around the browser-passworder library, that
* calls the encrypt and encryptWithDetail methods with the given number of iterations.
*
* @param iterations - The number of iterations to use for the PBKDF2 algorithm.
* @returns An encryptor set with the given number of iterations.
*/
export const encryptorFactory = (iterations: number) => ({
encrypt: encryptFactory(iterations),
encryptWithKey,
encryptWithDetail: encryptWithDetailFactory(iterations),
decrypt,
decryptWithKey,
decryptWithDetail,
keyFromPassword: keyFromPasswordFactory(iterations),
isVaultUpdated: isVaultUpdatedFactory(iterations),
importKey,
exportKey,
generateSalt,
});