2
2
* Code related to PBKDF2
3
3
* @module
4
4
*/
5
+ import { handler as AesCbcHandler } from "../aes/aes_cbc.js" ;
6
+ import { handler as AesCtrHandler } from "../aes/aes_ctr.js" ;
7
+ import { handler as AesGcmHandler } from "../aes/aes_gcm.js" ;
8
+ import { handler as AesKwHandler } from "../aes/aes_kw.js" ;
9
+ import {
10
+ Alg as AesAlg ,
11
+ AesCbcCryptoKey ,
12
+ AesCbcProxiedCryptoKey ,
13
+ AesCtrCryptoKey ,
14
+ AesCtrProxiedCryptoKey ,
15
+ AesGcmCryptoKey ,
16
+ AesGcmProxiedCryptoKey ,
17
+ AesKwCryptoKey ,
18
+ AesKwProxiedCryptoKey ,
19
+ AesProxiedCryptoKeys ,
20
+ } from "../aes/shared.js" ;
21
+ import {
22
+ Alg as HmacAlg ,
23
+ HmacCryptoKey ,
24
+ HmacProxiedCryptoKey ,
25
+ handler as hmacHandler ,
26
+ } from "../hmac/index.js" ;
5
27
import * as params from "../params.js" ;
6
28
import * as proxy from "../proxy.js" ;
7
29
import { Alg as SHA } from "../sha/shared.js" ;
@@ -82,39 +104,74 @@ export const generateKeyMaterial = async (
82
104
* @example
83
105
* ```ts
84
106
* const hmacParams: params.EnforcedHmacKeyGenParams = {
85
- * name: Authentication.Alg.Code.HMAC,
86
- * hash: SHA.Alg.Variant.SHA_512,
87
- * length: 512,
107
+ * name: Authentication.Alg.Code.HMAC,
108
+ * hash: SHA.Alg.Variant.SHA_512,
109
+ * length: 512,
88
110
* };
89
111
* let key = await PBKDF2.deriveKey(
90
- * { hash: "SHA512" },
91
- * keyMaterial,
92
- * hmacParams
112
+ * { hash: "SHA512" },
113
+ * keyMaterial,
114
+ * hmacParams
93
115
* );
94
116
* ```
95
117
* @example
96
118
* ```ts
97
119
* const hmacParams: params.EnforcedHmacKeyGenParams = {
98
- * name: Authentication.Alg.Code.HMAC,
99
- * hash: SHA.Alg.Variant.SHA_512,
100
- * length: 512,
120
+ * name: Authentication.Alg.Code.HMAC,
121
+ * hash: SHA.Alg.Variant.SHA_512,
122
+ * length: 512,
101
123
* };
124
+ * const keyMaterial = await PBKDF2.generateKeyMaterial(
125
+ * "raw",
126
+ * await Random.getValues(16)
127
+ * );
102
128
* let key = await keyMaterial.deriveKey(
103
- * { hash: "SHA512" },
104
- * hmacParams
129
+ * { hash: "SHA512" },
130
+ * hmacParams
131
+ * );
132
+ * ```
133
+ * @example
134
+ * ```ts
135
+ * const keyMaterial = await PBKDF2.generateKeyMaterial(
136
+ * "raw",
137
+ * await Random.getValues(16)
138
+ * );
139
+ * let key = await PBKDF2.deriveKey(
140
+ * {
141
+ * hash: "SHA-256",
142
+ * salt,
143
+ * },
144
+ * keyMaterial.self,
145
+ * {
146
+ * name: "AES-GCM",
147
+ * length: 256,
148
+ * }
149
+ * );
150
+ * ```
151
+ * @example
152
+ * ```ts
153
+ * const key = await keyMaterial.deriveKey(
154
+ * {
155
+ * hash: "SHA-256",
156
+ * salt,
157
+ * },
158
+ * {
159
+ * name: "AES-GCM",
160
+ * length: 256,
161
+ * }
105
162
* );
106
163
* ```
107
164
*/
108
- export const deriveKey = (
165
+ export const deriveKey = async (
109
166
algorithm : Omit < params . EnforcedPbkdf2Params , "name" | "iterations" > ,
110
167
baseKey : Pbkdf2KeyMaterial ,
111
168
derivedKeyType :
112
169
| params . EnforcedAesKeyGenParams
113
170
| params . EnforcedHmacKeyGenParams ,
114
171
extractable ?: boolean ,
115
172
keyUsages ?: KeyUsage [ ]
116
- ) =>
117
- KdfShared . deriveKey (
173
+ ) : Promise < HmacProxiedCryptoKey | AesProxiedCryptoKeys > => {
174
+ const derived = await KdfShared . deriveKey (
118
175
{
119
176
...algorithm ,
120
177
name : Alg . Variant . PBKDF2 ,
@@ -128,6 +185,32 @@ export const deriveKey = (
128
185
keyUsages
129
186
) ;
130
187
188
+ switch ( derivedKeyType . name ) {
189
+ case HmacAlg . Code . HMAC :
190
+ return proxy . proxifyKey < HmacCryptoKey , HmacProxiedCryptoKey > (
191
+ hmacHandler
192
+ ) ( derived as HmacCryptoKey ) ;
193
+ case AesAlg . Mode . AES_CBC :
194
+ return proxy . proxifyKey < AesCbcCryptoKey , AesCbcProxiedCryptoKey > (
195
+ AesCbcHandler
196
+ ) ( derived as AesCbcCryptoKey ) ;
197
+ case AesAlg . Mode . AES_CTR :
198
+ return proxy . proxifyKey < AesCtrCryptoKey , AesCtrProxiedCryptoKey > (
199
+ AesCtrHandler
200
+ ) ( derived as AesCtrCryptoKey ) ;
201
+ case AesAlg . Mode . AES_GCM :
202
+ return proxy . proxifyKey < AesGcmCryptoKey , AesGcmProxiedCryptoKey > (
203
+ AesGcmHandler
204
+ ) ( derived as AesGcmCryptoKey ) ;
205
+ case AesAlg . Mode . AES_KW :
206
+ return proxy . proxifyKey < AesKwCryptoKey , AesKwProxiedCryptoKey > (
207
+ AesKwHandler
208
+ ) ( derived as AesKwCryptoKey ) ;
209
+ }
210
+
211
+ throw new Error ( "Invalid alg" ) ;
212
+ } ;
213
+
131
214
/**
132
215
* Derive a number bits with a given key material
133
216
* @example
0 commit comments