Skip to content

Commit 852ff09

Browse files
committed
Update to proxy hkdf and pbkdf
1 parent 7e60a5f commit 852ff09

File tree

8 files changed

+189
-22
lines changed

8 files changed

+189
-22
lines changed

src/aes/aes_cbc.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
Alg,
1313
} from "./shared.js";
1414

15-
const handler: ProxyHandler<AesCbcCryptoKey> = {
15+
export const handler: ProxyHandler<AesCbcCryptoKey> = {
1616
get(target: AesCbcCryptoKey, prop: string) {
1717
switch (prop) {
1818
case "self":

src/aes/aes_ctr.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
Alg,
1414
} from "./shared.js";
1515

16-
const handler: ProxyHandler<AesCtrCryptoKey> = {
16+
export const handler: ProxyHandler<AesCtrCryptoKey> = {
1717
get(target: AesCtrCryptoKey, prop: string) {
1818
switch (prop) {
1919
case "self":

src/aes/aes_gcm.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
Alg,
1212
} from "./shared.js";
1313

14-
const handler: ProxyHandler<AesGcmCryptoKey> = {
14+
export const handler: ProxyHandler<AesGcmCryptoKey> = {
1515
get(target: AesGcmCryptoKey, prop: string) {
1616
switch (prop) {
1717
case "self":

src/aes/aes_kw.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
Alg,
1212
} from "./shared.js";
1313

14-
const handler: ProxyHandler<AesKwCryptoKey> = {
14+
export const handler: ProxyHandler<AesKwCryptoKey> = {
1515
get(target: AesKwCryptoKey, prop: string) {
1616
switch (prop) {
1717
case "self":

src/aes/shared.ts

+6
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,9 @@ export interface AesKwProxiedCryptoKey
237237

238238
exportKey: (format: KeyFormat) => Promise<JsonWebKey | ArrayBuffer>;
239239
}
240+
241+
export type AesProxiedCryptoKeys =
242+
| AesCbcProxiedCryptoKey
243+
| AesKwProxiedCryptoKey
244+
| AesGcmProxiedCryptoKey
245+
| AesCtrProxiedCryptoKey;

src/hmac/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export interface HmacProxiedCryptoKey
1818
exportKey: (format: KeyFormat) => Promise<JsonWebKey | ArrayBuffer>;
1919
}
2020

21-
const handler: ProxyHandler<HmacCryptoKey> = {
21+
export const handler: ProxyHandler<HmacCryptoKey> = {
2222
get(target: HmacCryptoKey, prop: string) {
2323
switch (prop) {
2424
case "self":

src/kdf/hkdf.ts

+81-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,28 @@
22
* Code related to HKDF
33
* @module
44
*/
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";
527
import * as params from "../params.js";
628
import * as proxy from "../proxy.js";
729
import {
@@ -98,17 +120,47 @@ export const generateKeyMaterial = async (
98120
* hmacParams
99121
* );
100122
* ```
123+
* @example
124+
* ```ts
125+
* const keyMaterial = await HKDF.generateKeyMaterial(
126+
* "raw",
127+
* await Random.getValues(16)
128+
* );
129+
* let key = await HKDF.deriveKey(
130+
* {
131+
* hash: "SHA-256",
132+
* salt,
133+
* },
134+
* keyMaterial.self,
135+
* {
136+
* name: "AES-GCM",
137+
* length: 256,
138+
* }
139+
* );
140+
* ```
141+
* @example
142+
* ```ts
143+
* const key = await keyMaterial.deriveKey(
144+
* {
145+
* hash: "SHA-256",
146+
* salt,
147+
* },
148+
* {
149+
* name: "AES-GCM",
150+
* length: 256,
151+
* }
152+
* );
101153
*/
102-
export const deriveKey = (
154+
export const deriveKey = async (
103155
algorithm: Omit<params.EnforcedHkdfParams, "name">,
104156
baseKey: HkdfKeyMaterial,
105157
derivedKeyType:
106158
| params.EnforcedAesKeyGenParams
107159
| params.EnforcedHmacKeyGenParams,
108160
extractable?: boolean,
109161
keyUsages?: KeyUsage[]
110-
) =>
111-
KdfShared.deriveKey(
162+
): Promise<HmacProxiedCryptoKey | AesProxiedCryptoKeys> => {
163+
const derived = await KdfShared.deriveKey(
112164
{
113165
...algorithm,
114166
name: Alg.Variant.HKDF,
@@ -119,6 +171,32 @@ export const deriveKey = (
119171
keyUsages
120172
);
121173

174+
switch (derivedKeyType.name) {
175+
case HmacAlg.Code.HMAC:
176+
return proxy.proxifyKey<HmacCryptoKey, HmacProxiedCryptoKey>(
177+
hmacHandler
178+
)(derived as HmacCryptoKey);
179+
case AesAlg.Mode.AES_CBC:
180+
return proxy.proxifyKey<AesCbcCryptoKey, AesCbcProxiedCryptoKey>(
181+
AesCbcHandler
182+
)(derived as AesCbcCryptoKey);
183+
case AesAlg.Mode.AES_CTR:
184+
return proxy.proxifyKey<AesCtrCryptoKey, AesCtrProxiedCryptoKey>(
185+
AesCtrHandler
186+
)(derived as AesCtrCryptoKey);
187+
case AesAlg.Mode.AES_GCM:
188+
return proxy.proxifyKey<AesGcmCryptoKey, AesGcmProxiedCryptoKey>(
189+
AesGcmHandler
190+
)(derived as AesGcmCryptoKey);
191+
case AesAlg.Mode.AES_KW:
192+
return proxy.proxifyKey<AesKwCryptoKey, AesKwProxiedCryptoKey>(
193+
AesKwHandler
194+
)(derived as AesKwCryptoKey);
195+
}
196+
197+
throw new Error("Invalid alg");
198+
};
199+
122200
/**
123201
* Derive a number bits with a given key material
124202
* @example

src/kdf/pbkdf.ts

+97-14
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,28 @@
22
* Code related to PBKDF2
33
* @module
44
*/
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";
527
import * as params from "../params.js";
628
import * as proxy from "../proxy.js";
729
import { Alg as SHA } from "../sha/shared.js";
@@ -82,39 +104,74 @@ export const generateKeyMaterial = async (
82104
* @example
83105
* ```ts
84106
* 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,
88110
* };
89111
* let key = await PBKDF2.deriveKey(
90-
* { hash: "SHA512" },
91-
* keyMaterial,
92-
* hmacParams
112+
* { hash: "SHA512" },
113+
* keyMaterial,
114+
* hmacParams
93115
* );
94116
* ```
95117
* @example
96118
* ```ts
97119
* 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,
101123
* };
124+
* const keyMaterial = await PBKDF2.generateKeyMaterial(
125+
* "raw",
126+
* await Random.getValues(16)
127+
* );
102128
* 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+
* }
105162
* );
106163
* ```
107164
*/
108-
export const deriveKey = (
165+
export const deriveKey = async (
109166
algorithm: Omit<params.EnforcedPbkdf2Params, "name" | "iterations">,
110167
baseKey: Pbkdf2KeyMaterial,
111168
derivedKeyType:
112169
| params.EnforcedAesKeyGenParams
113170
| params.EnforcedHmacKeyGenParams,
114171
extractable?: boolean,
115172
keyUsages?: KeyUsage[]
116-
) =>
117-
KdfShared.deriveKey(
173+
): Promise<HmacProxiedCryptoKey | AesProxiedCryptoKeys> => {
174+
const derived = await KdfShared.deriveKey(
118175
{
119176
...algorithm,
120177
name: Alg.Variant.PBKDF2,
@@ -128,6 +185,32 @@ export const deriveKey = (
128185
keyUsages
129186
);
130187

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+
131214
/**
132215
* Derive a number bits with a given key material
133216
* @example

0 commit comments

Comments
 (0)