Skip to content

Commit 13115c8

Browse files
Make the function signature overloads of SubtleCrypto#exportKey more flexible (microsoft#1593)
Co-authored-by: saschanaz <[email protected]>
1 parent 9e884a8 commit 13115c8

File tree

6 files changed

+54
-18
lines changed

6 files changed

+54
-18
lines changed

baselines/dom.generated.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21839,6 +21839,7 @@ interface SubtleCrypto {
2183921839
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */
2184021840
exportKey(format: "jwk", key: CryptoKey): Promise<JsonWebKey>;
2184121841
exportKey(format: Exclude<KeyFormat, "jwk">, key: CryptoKey): Promise<ArrayBuffer>;
21842+
exportKey(format: KeyFormat, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey>;
2184221843
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */
2184321844
generateKey(algorithm: "Ed25519", extractable: boolean, keyUsages: ReadonlyArray<"sign" | "verify">): Promise<CryptoKeyPair>;
2184421845
generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKeyPair>;

baselines/serviceworker.generated.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5016,6 +5016,7 @@ interface SubtleCrypto {
50165016
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */
50175017
exportKey(format: "jwk", key: CryptoKey): Promise<JsonWebKey>;
50185018
exportKey(format: Exclude<KeyFormat, "jwk">, key: CryptoKey): Promise<ArrayBuffer>;
5019+
exportKey(format: KeyFormat, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey>;
50195020
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */
50205021
generateKey(algorithm: "Ed25519", extractable: boolean, keyUsages: ReadonlyArray<"sign" | "verify">): Promise<CryptoKeyPair>;
50215022
generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKeyPair>;

baselines/sharedworker.generated.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4827,6 +4827,7 @@ interface SubtleCrypto {
48274827
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */
48284828
exportKey(format: "jwk", key: CryptoKey): Promise<JsonWebKey>;
48294829
exportKey(format: Exclude<KeyFormat, "jwk">, key: CryptoKey): Promise<ArrayBuffer>;
4830+
exportKey(format: KeyFormat, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey>;
48304831
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */
48314832
generateKey(algorithm: "Ed25519", extractable: boolean, keyUsages: ReadonlyArray<"sign" | "verify">): Promise<CryptoKeyPair>;
48324833
generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKeyPair>;

baselines/webworker.generated.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5322,6 +5322,7 @@ interface SubtleCrypto {
53225322
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */
53235323
exportKey(format: "jwk", key: CryptoKey): Promise<JsonWebKey>;
53245324
exportKey(format: Exclude<KeyFormat, "jwk">, key: CryptoKey): Promise<ArrayBuffer>;
5325+
exportKey(format: KeyFormat, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey>;
53255326
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */
53265327
generateKey(algorithm: "Ed25519", extractable: boolean, keyUsages: ReadonlyArray<"sign" | "verify">): Promise<CryptoKeyPair>;
53275328
generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKeyPair>;

inputfiles/overridingTypes.jsonc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1572,17 +1572,18 @@
15721572
},
15731573
"exportKey": {
15741574
"additionalSignatures": [
1575-
"exportKey(format: \"jwk\", key: CryptoKey): Promise<JsonWebKey>"
1575+
"exportKey(format: \"jwk\", key: CryptoKey): Promise<JsonWebKey>",
1576+
"exportKey(format: Exclude<KeyFormat, \"jwk\">, key: CryptoKey): Promise<ArrayBuffer>"
15761577
],
15771578
"signature": {
15781579
"0": {
15791580
"param": [
15801581
{
15811582
"name": "format",
1582-
"overrideType": "Exclude<KeyFormat, \"jwk\">"
1583+
"overrideType": "KeyFormat"
15831584
}
15841585
],
1585-
"overrideType": "Promise<ArrayBuffer>"
1586+
"overrideType": "Promise<ArrayBuffer | JsonWebKey>"
15861587
}
15871588
}
15881589
},

unittests/files/keyusage.ts

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,46 @@
1-
const usageInline = crypto.subtle.generateKey({
2-
name: "AES-GCM",
3-
length: 256,
4-
}, true, ['encrypt', 'decrypt'])
5-
6-
const usageConst = crypto.subtle.generateKey( {
7-
name: "AES-GCM",
8-
length: 256,
9-
}, true, ['encrypt', 'decrypt'] as const)
10-
11-
const keyUsage: ReadonlyArray<KeyUsage> = ['encrypt', 'decrypt']
12-
const usageAsReadonly = crypto.subtle.generateKey( {
13-
name: "AES-GCM",
14-
length: 256,
15-
}, true, keyUsage)
1+
function assertType<T>(_x: T) {}
2+
3+
const mockKey = {} as CryptoKey;
4+
5+
assertType<Promise<JsonWebKey>>(crypto.subtle.exportKey("jwk", mockKey));
6+
assertType<Promise<ArrayBuffer>>(crypto.subtle.exportKey("pkcs8", mockKey));
7+
assertType<Promise<ArrayBuffer>>(crypto.subtle.exportKey("raw", mockKey));
8+
assertType<Promise<ArrayBuffer>>(crypto.subtle.exportKey("spki", mockKey));
9+
10+
assertType<Promise<ArrayBuffer | JsonWebKey>>(
11+
crypto.subtle
12+
.exportKey("" as KeyFormat, mockKey)
13+
.then((ambiguousExportedKeyData) =>
14+
ambiguousExportedKeyData instanceof ArrayBuffer
15+
? (ambiguousExportedKeyData satisfies ArrayBuffer)
16+
: (ambiguousExportedKeyData satisfies JsonWebKey)
17+
)
18+
);
19+
20+
const usageInline = crypto.subtle.generateKey(
21+
{
22+
name: "AES-GCM",
23+
length: 256,
24+
},
25+
true,
26+
["encrypt", "decrypt"]
27+
);
28+
29+
const usageConst = crypto.subtle.generateKey(
30+
{
31+
name: "AES-GCM",
32+
length: 256,
33+
},
34+
true,
35+
["encrypt", "decrypt"] as const
36+
);
37+
38+
const keyUsage: ReadonlyArray<KeyUsage> = ["encrypt", "decrypt"];
39+
const usageAsReadonly = crypto.subtle.generateKey(
40+
{
41+
name: "AES-GCM",
42+
length: 256,
43+
},
44+
true,
45+
keyUsage
46+
);

0 commit comments

Comments
 (0)