jose 5.10.0 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -15
- package/dist/types/index.d.ts +48 -48
- package/dist/types/jwe/compact/decrypt.d.ts +4 -4
- package/dist/types/jwe/compact/encrypt.d.ts +4 -4
- package/dist/types/jwe/flattened/decrypt.d.ts +4 -4
- package/dist/types/jwe/flattened/encrypt.d.ts +6 -6
- package/dist/types/jwe/general/decrypt.d.ts +4 -4
- package/dist/types/jwe/general/encrypt.d.ts +7 -7
- package/dist/types/jwk/embedded.d.ts +2 -2
- package/dist/types/jwk/thumbprint.d.ts +5 -5
- package/dist/types/jwks/local.d.ts +2 -2
- package/dist/types/jwks/remote.d.ts +104 -25
- package/dist/types/jws/compact/sign.d.ts +4 -4
- package/dist/types/jws/compact/verify.d.ts +4 -4
- package/dist/types/jws/flattened/sign.d.ts +4 -4
- package/dist/types/jws/flattened/verify.d.ts +4 -4
- package/dist/types/jws/general/sign.d.ts +6 -6
- package/dist/types/jws/general/verify.d.ts +4 -4
- package/dist/types/jwt/decrypt.d.ts +5 -5
- package/dist/types/jwt/encrypt.d.ts +5 -5
- package/dist/types/jwt/produce.d.ts +3 -3
- package/dist/types/jwt/sign.d.ts +4 -4
- package/dist/types/jwt/unsecured.d.ts +6 -6
- package/dist/types/jwt/verify.d.ts +5 -5
- package/dist/types/key/export.d.ts +10 -12
- package/dist/types/key/generate_key_pair.d.ts +10 -11
- package/dist/types/key/generate_secret.d.ts +6 -9
- package/dist/types/key/import.d.ts +20 -27
- package/dist/types/types.d.ts +27 -29
- package/dist/types/util/decode_jwt.d.ts +2 -2
- package/dist/types/util/decode_protected_header.d.ts +2 -2
- package/dist/types/util/errors.d.ts +6 -6
- package/dist/{browser → webapi}/index.js +2 -2
- package/dist/{node/esm → webapi}/jwe/flattened/decrypt.js +8 -4
- package/dist/{node/esm → webapi}/jwe/flattened/encrypt.js +7 -3
- package/dist/{node/esm → webapi}/jwe/general/encrypt.js +8 -3
- package/dist/{node/esm → webapi}/jwk/thumbprint.js +18 -8
- package/dist/{node/esm → webapi}/jwks/local.js +1 -6
- package/dist/{node/esm → webapi}/jwks/remote.js +34 -6
- package/dist/{node/esm → webapi}/jws/flattened/sign.js +7 -5
- package/dist/{browser → webapi}/jws/flattened/verify.js +8 -14
- package/dist/{browser → webapi}/jwt/unsecured.js +1 -1
- package/dist/{node/esm → webapi}/key/export.js +2 -3
- package/dist/{browser/runtime/generate.js → webapi/key/generate_key_pair.js} +4 -57
- package/dist/webapi/key/generate_secret.js +40 -0
- package/dist/{browser → webapi}/key/import.js +8 -6
- package/dist/{node/esm → webapi}/lib/aesgcmkw.js +3 -3
- package/dist/{browser/runtime → webapi/lib}/aeskw.js +9 -16
- package/dist/{browser/runtime → webapi/lib}/asn1.js +24 -20
- package/dist/{browser/runtime → webapi/lib}/base64url.js +17 -9
- package/dist/{browser → webapi}/lib/buffer_utils.js +4 -19
- package/dist/{browser → webapi}/lib/cek.js +1 -2
- package/dist/{browser/runtime → webapi/lib}/check_cek_length.js +1 -2
- package/dist/{browser → webapi}/lib/check_iv_length.js +1 -2
- package/dist/webapi/lib/check_key_type.js +126 -0
- package/dist/{node/esm → webapi}/lib/crypto_key.js +9 -26
- package/dist/{browser/runtime → webapi/lib}/decrypt.js +26 -10
- package/dist/{node/esm → webapi}/lib/decrypt_key_management.js +22 -24
- package/dist/{browser/runtime → webapi/lib}/digest.js +1 -3
- package/dist/webapi/lib/ecdhes.js +46 -0
- package/dist/{browser/runtime → webapi/lib}/encrypt.js +8 -10
- package/dist/{node/esm → webapi}/lib/encrypt_key_management.js +26 -23
- package/dist/webapi/lib/get_sign_verify_key.js +12 -0
- package/dist/{node/esm → webapi}/lib/is_disjoint.js +1 -2
- package/dist/{browser → webapi}/lib/is_jwk.js +1 -1
- package/dist/webapi/lib/is_key_like.js +14 -0
- package/dist/{browser → webapi}/lib/is_object.js +2 -2
- package/dist/{node/esm → webapi}/lib/iv.js +1 -2
- package/dist/{browser/runtime → webapi/lib}/jwk_to_key.js +3 -13
- package/dist/webapi/lib/key_to_jwk.js +27 -0
- package/dist/webapi/lib/normalize_key.js +164 -0
- package/dist/webapi/lib/pbes2kw.js +37 -0
- package/dist/webapi/lib/rsaes.js +24 -0
- package/dist/{browser/runtime → webapi/lib}/sign.js +1 -3
- package/dist/{browser/runtime → webapi/lib}/subtle_dsa.js +4 -5
- package/dist/{browser → webapi}/lib/validate_algorithms.js +1 -2
- package/dist/{node/esm → webapi}/lib/validate_crit.js +3 -4
- package/dist/{browser/runtime → webapi/lib}/verify.js +1 -3
- package/dist/{node/esm → webapi}/util/base64url.js +1 -1
- package/package.json +36 -219
- package/dist/browser/jwe/compact/encrypt.js +0 -26
- package/dist/browser/jwe/flattened/decrypt.js +0 -161
- package/dist/browser/jwe/flattened/encrypt.js +0 -153
- package/dist/browser/jwe/general/encrypt.js +0 -174
- package/dist/browser/jwk/thumbprint.js +0 -53
- package/dist/browser/jwks/local.js +0 -124
- package/dist/browser/jwks/remote.js +0 -139
- package/dist/browser/jws/compact/sign.js +0 -17
- package/dist/browser/jws/flattened/sign.js +0 -81
- package/dist/browser/jws/general/sign.js +0 -67
- package/dist/browser/jwt/encrypt.js +0 -68
- package/dist/browser/jwt/produce.js +0 -75
- package/dist/browser/jwt/sign.js +0 -20
- package/dist/browser/key/export.js +0 -12
- package/dist/browser/key/generate_key_pair.js +0 -4
- package/dist/browser/key/generate_secret.js +0 -4
- package/dist/browser/lib/aesgcmkw.js +0 -16
- package/dist/browser/lib/check_key_type.js +0 -77
- package/dist/browser/lib/check_p2s.js +0 -6
- package/dist/browser/lib/crypto_key.js +0 -157
- package/dist/browser/lib/decrypt_key_management.js +0 -129
- package/dist/browser/lib/encrypt_key_management.js +0 -89
- package/dist/browser/lib/format_pem.js +0 -4
- package/dist/browser/lib/is_disjoint.js +0 -22
- package/dist/browser/lib/iv.js +0 -20
- package/dist/browser/lib/validate_crit.js +0 -34
- package/dist/browser/package.json +0 -1
- package/dist/browser/runtime/bogus.js +0 -6
- package/dist/browser/runtime/ecdhes.js +0 -47
- package/dist/browser/runtime/fetch_jwks.js +0 -34
- package/dist/browser/runtime/get_sign_verify_key.js +0 -24
- package/dist/browser/runtime/is_key_like.js +0 -8
- package/dist/browser/runtime/key_to_jwk.js +0 -21
- package/dist/browser/runtime/normalize_key.js +0 -68
- package/dist/browser/runtime/pbes2kw.js +0 -51
- package/dist/browser/runtime/random.js +0 -2
- package/dist/browser/runtime/rsaes.js +0 -37
- package/dist/browser/runtime/runtime.js +0 -1
- package/dist/browser/runtime/subtle_rsaes.js +0 -12
- package/dist/browser/runtime/timing_safe_equal.js +0 -19
- package/dist/browser/runtime/webcrypto.js +0 -2
- package/dist/browser/util/base64url.js +0 -3
- package/dist/browser/util/errors.js +0 -114
- package/dist/browser/util/runtime.js +0 -2
- package/dist/node/cjs/index.js +0 -69
- package/dist/node/cjs/jwe/compact/decrypt.js +0 -30
- package/dist/node/cjs/jwe/compact/encrypt.js +0 -31
- package/dist/node/cjs/jwe/flattened/decrypt.js +0 -164
- package/dist/node/cjs/jwe/flattened/encrypt.js +0 -165
- package/dist/node/cjs/jwe/general/decrypt.js +0 -34
- package/dist/node/cjs/jwe/general/encrypt.js +0 -186
- package/dist/node/cjs/jwk/embedded.js +0 -20
- package/dist/node/cjs/jwk/thumbprint.js +0 -57
- package/dist/node/cjs/jwks/local.js +0 -128
- package/dist/node/cjs/jwks/remote.js +0 -152
- package/dist/node/cjs/jws/compact/sign.js +0 -22
- package/dist/node/cjs/jws/compact/verify.js +0 -24
- package/dist/node/cjs/jws/flattened/sign.js +0 -88
- package/dist/node/cjs/jws/flattened/verify.js +0 -125
- package/dist/node/cjs/jws/general/sign.js +0 -77
- package/dist/node/cjs/jws/general/verify.js +0 -27
- package/dist/node/cjs/jwt/decrypt.js +0 -26
- package/dist/node/cjs/jwt/encrypt.js +0 -79
- package/dist/node/cjs/jwt/produce.js +0 -80
- package/dist/node/cjs/jwt/sign.js +0 -25
- package/dist/node/cjs/jwt/unsecured.js +0 -36
- package/dist/node/cjs/jwt/verify.js +0 -18
- package/dist/node/cjs/key/export.js +0 -17
- package/dist/node/cjs/key/generate_key_pair.js +0 -7
- package/dist/node/cjs/key/generate_secret.js +0 -7
- package/dist/node/cjs/key/import.js +0 -51
- package/dist/node/cjs/lib/aesgcmkw.js +0 -20
- package/dist/node/cjs/lib/buffer_utils.js +0 -60
- package/dist/node/cjs/lib/cek.js +0 -23
- package/dist/node/cjs/lib/check_iv_length.js +0 -10
- package/dist/node/cjs/lib/check_key_type.js +0 -80
- package/dist/node/cjs/lib/check_p2s.js +0 -9
- package/dist/node/cjs/lib/crypto_key.js +0 -161
- package/dist/node/cjs/lib/decrypt_key_management.js +0 -131
- package/dist/node/cjs/lib/encrypt_key_management.js +0 -91
- package/dist/node/cjs/lib/epoch.js +0 -3
- package/dist/node/cjs/lib/invalid_key_input.js +0 -34
- package/dist/node/cjs/lib/is_disjoint.js +0 -24
- package/dist/node/cjs/lib/is_jwk.js +0 -19
- package/dist/node/cjs/lib/is_object.js +0 -19
- package/dist/node/cjs/lib/iv.js +0 -23
- package/dist/node/cjs/lib/jwt_claims_set.js +0 -106
- package/dist/node/cjs/lib/private_symbols.js +0 -4
- package/dist/node/cjs/lib/secs.js +0 -57
- package/dist/node/cjs/lib/validate_algorithms.js +0 -13
- package/dist/node/cjs/lib/validate_crit.js +0 -36
- package/dist/node/cjs/runtime/aeskw.js +0 -55
- package/dist/node/cjs/runtime/asn1.js +0 -54
- package/dist/node/cjs/runtime/base64url.js +0 -20
- package/dist/node/cjs/runtime/cbc_tag.js +0 -11
- package/dist/node/cjs/runtime/check_cek_length.js +0 -37
- package/dist/node/cjs/runtime/check_key_length.js +0 -18
- package/dist/node/cjs/runtime/ciphers.js +0 -8
- package/dist/node/cjs/runtime/decrypt.js +0 -103
- package/dist/node/cjs/runtime/digest.js +0 -5
- package/dist/node/cjs/runtime/dsa_digest.js +0 -26
- package/dist/node/cjs/runtime/ecdhes.js +0 -70
- package/dist/node/cjs/runtime/encrypt.js +0 -80
- package/dist/node/cjs/runtime/fetch_jwks.js +0 -45
- package/dist/node/cjs/runtime/generate.js +0 -103
- package/dist/node/cjs/runtime/get_named_curve.js +0 -61
- package/dist/node/cjs/runtime/get_sign_verify_key.js +0 -31
- package/dist/node/cjs/runtime/hmac_digest.js +0 -16
- package/dist/node/cjs/runtime/is_key_like.js +0 -11
- package/dist/node/cjs/runtime/is_key_object.js +0 -4
- package/dist/node/cjs/runtime/jwk_to_key.js +0 -10
- package/dist/node/cjs/runtime/key_to_jwk.js +0 -36
- package/dist/node/cjs/runtime/node_key.js +0 -111
- package/dist/node/cjs/runtime/normalize_key.js +0 -3
- package/dist/node/cjs/runtime/pbes2kw.js +0 -48
- package/dist/node/cjs/runtime/random.js +0 -5
- package/dist/node/cjs/runtime/rsaes.js +0 -71
- package/dist/node/cjs/runtime/runtime.js +0 -3
- package/dist/node/cjs/runtime/sign.js +0 -19
- package/dist/node/cjs/runtime/timing_safe_equal.js +0 -5
- package/dist/node/cjs/runtime/verify.js +0 -31
- package/dist/node/cjs/runtime/webcrypto.js +0 -9
- package/dist/node/cjs/util/base64url.js +0 -6
- package/dist/node/cjs/util/decode_jwt.js +0 -35
- package/dist/node/cjs/util/decode_protected_header.js +0 -37
- package/dist/node/cjs/util/errors.js +0 -117
- package/dist/node/cjs/util/runtime.js +0 -4
- package/dist/node/esm/index.js +0 -30
- package/dist/node/esm/jwe/compact/decrypt.js +0 -27
- package/dist/node/esm/jwe/general/decrypt.js +0 -31
- package/dist/node/esm/jwk/embedded.js +0 -17
- package/dist/node/esm/jws/compact/verify.js +0 -21
- package/dist/node/esm/jws/flattened/verify.js +0 -122
- package/dist/node/esm/jws/general/verify.js +0 -24
- package/dist/node/esm/jwt/decrypt.js +0 -23
- package/dist/node/esm/jwt/unsecured.js +0 -32
- package/dist/node/esm/jwt/verify.js +0 -15
- package/dist/node/esm/key/generate_key_pair.js +0 -4
- package/dist/node/esm/key/generate_secret.js +0 -4
- package/dist/node/esm/key/import.js +0 -45
- package/dist/node/esm/lib/buffer_utils.js +0 -51
- package/dist/node/esm/lib/cek.js +0 -20
- package/dist/node/esm/lib/check_iv_length.js +0 -8
- package/dist/node/esm/lib/check_key_type.js +0 -77
- package/dist/node/esm/lib/check_p2s.js +0 -6
- package/dist/node/esm/lib/epoch.js +0 -1
- package/dist/node/esm/lib/invalid_key_input.js +0 -31
- package/dist/node/esm/lib/is_jwk.js +0 -13
- package/dist/node/esm/lib/is_object.js +0 -16
- package/dist/node/esm/lib/jwt_claims_set.js +0 -104
- package/dist/node/esm/lib/private_symbols.js +0 -1
- package/dist/node/esm/lib/secs.js +0 -55
- package/dist/node/esm/lib/validate_algorithms.js +0 -11
- package/dist/node/esm/package.json +0 -1
- package/dist/node/esm/runtime/aeskw.js +0 -50
- package/dist/node/esm/runtime/asn1.js +0 -46
- package/dist/node/esm/runtime/base64url.js +0 -14
- package/dist/node/esm/runtime/cbc_tag.js +0 -8
- package/dist/node/esm/runtime/check_cek_length.js +0 -35
- package/dist/node/esm/runtime/check_key_length.js +0 -16
- package/dist/node/esm/runtime/ciphers.js +0 -6
- package/dist/node/esm/runtime/decrypt.js +0 -101
- package/dist/node/esm/runtime/digest.js +0 -3
- package/dist/node/esm/runtime/dsa_digest.js +0 -23
- package/dist/node/esm/runtime/ecdhes.js +0 -64
- package/dist/node/esm/runtime/encrypt.js +0 -78
- package/dist/node/esm/runtime/fetch_jwks.js +0 -43
- package/dist/node/esm/runtime/generate.js +0 -99
- package/dist/node/esm/runtime/get_named_curve.js +0 -58
- package/dist/node/esm/runtime/get_sign_verify_key.js +0 -28
- package/dist/node/esm/runtime/hmac_digest.js +0 -13
- package/dist/node/esm/runtime/is_key_like.js +0 -8
- package/dist/node/esm/runtime/is_key_object.js +0 -2
- package/dist/node/esm/runtime/jwk_to_key.js +0 -8
- package/dist/node/esm/runtime/key_to_jwk.js +0 -34
- package/dist/node/esm/runtime/node_key.js +0 -108
- package/dist/node/esm/runtime/normalize_key.js +0 -1
- package/dist/node/esm/runtime/pbes2kw.js +0 -43
- package/dist/node/esm/runtime/random.js +0 -1
- package/dist/node/esm/runtime/rsaes.js +0 -66
- package/dist/node/esm/runtime/runtime.js +0 -1
- package/dist/node/esm/runtime/sign.js +0 -17
- package/dist/node/esm/runtime/timing_safe_equal.js +0 -3
- package/dist/node/esm/runtime/verify.js +0 -29
- package/dist/node/esm/runtime/webcrypto.js +0 -5
- package/dist/node/esm/util/decode_jwt.js +0 -32
- package/dist/node/esm/util/decode_protected_header.js +0 -34
- package/dist/node/esm/util/runtime.js +0 -2
- package/dist/types/util/runtime.d.ts +0 -3
- /package/dist/{browser → webapi}/jwe/compact/decrypt.js +0 -0
- /package/dist/{node/esm → webapi}/jwe/compact/encrypt.js +0 -0
- /package/dist/{browser → webapi}/jwe/general/decrypt.js +0 -0
- /package/dist/{browser → webapi}/jwk/embedded.js +0 -0
- /package/dist/{node/esm → webapi}/jws/compact/sign.js +0 -0
- /package/dist/{browser → webapi}/jws/compact/verify.js +0 -0
- /package/dist/{node/esm → webapi}/jws/general/sign.js +0 -0
- /package/dist/{browser → webapi}/jws/general/verify.js +0 -0
- /package/dist/{browser → webapi}/jwt/decrypt.js +0 -0
- /package/dist/{node/esm → webapi}/jwt/encrypt.js +0 -0
- /package/dist/{node/esm → webapi}/jwt/produce.js +0 -0
- /package/dist/{node/esm → webapi}/jwt/sign.js +0 -0
- /package/dist/{browser → webapi}/jwt/verify.js +0 -0
- /package/dist/{browser/runtime → webapi/lib}/check_key_length.js +0 -0
- /package/dist/{browser → webapi}/lib/epoch.js +0 -0
- /package/dist/{browser → webapi}/lib/invalid_key_input.js +0 -0
- /package/dist/{browser → webapi}/lib/jwt_claims_set.js +0 -0
- /package/dist/{browser → webapi}/lib/private_symbols.js +0 -0
- /package/dist/{browser → webapi}/lib/secs.js +0 -0
- /package/dist/{browser → webapi}/util/decode_jwt.js +0 -0
- /package/dist/{browser → webapi}/util/decode_protected_header.js +0 -0
- /package/dist/{node/esm → webapi}/util/errors.js +0 -0
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { encode as base64url } from '../../runtime/base64url.js';
|
|
2
|
-
import sign from '../../runtime/sign.js';
|
|
3
|
-
import isDisjoint from '../../lib/is_disjoint.js';
|
|
4
|
-
import { JWSInvalid } from '../../util/errors.js';
|
|
5
|
-
import { encoder, decoder, concat } from '../../lib/buffer_utils.js';
|
|
6
|
-
import { checkKeyTypeWithJwk } from '../../lib/check_key_type.js';
|
|
7
|
-
import validateCrit from '../../lib/validate_crit.js';
|
|
8
|
-
export class FlattenedSign {
|
|
9
|
-
constructor(payload) {
|
|
10
|
-
if (!(payload instanceof Uint8Array)) {
|
|
11
|
-
throw new TypeError('payload must be an instance of Uint8Array');
|
|
12
|
-
}
|
|
13
|
-
this._payload = payload;
|
|
14
|
-
}
|
|
15
|
-
setProtectedHeader(protectedHeader) {
|
|
16
|
-
if (this._protectedHeader) {
|
|
17
|
-
throw new TypeError('setProtectedHeader can only be called once');
|
|
18
|
-
}
|
|
19
|
-
this._protectedHeader = protectedHeader;
|
|
20
|
-
return this;
|
|
21
|
-
}
|
|
22
|
-
setUnprotectedHeader(unprotectedHeader) {
|
|
23
|
-
if (this._unprotectedHeader) {
|
|
24
|
-
throw new TypeError('setUnprotectedHeader can only be called once');
|
|
25
|
-
}
|
|
26
|
-
this._unprotectedHeader = unprotectedHeader;
|
|
27
|
-
return this;
|
|
28
|
-
}
|
|
29
|
-
async sign(key, options) {
|
|
30
|
-
if (!this._protectedHeader && !this._unprotectedHeader) {
|
|
31
|
-
throw new JWSInvalid('either setProtectedHeader or setUnprotectedHeader must be called before #sign()');
|
|
32
|
-
}
|
|
33
|
-
if (!isDisjoint(this._protectedHeader, this._unprotectedHeader)) {
|
|
34
|
-
throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');
|
|
35
|
-
}
|
|
36
|
-
const joseHeader = {
|
|
37
|
-
...this._protectedHeader,
|
|
38
|
-
...this._unprotectedHeader,
|
|
39
|
-
};
|
|
40
|
-
const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, this._protectedHeader, joseHeader);
|
|
41
|
-
let b64 = true;
|
|
42
|
-
if (extensions.has('b64')) {
|
|
43
|
-
b64 = this._protectedHeader.b64;
|
|
44
|
-
if (typeof b64 !== 'boolean') {
|
|
45
|
-
throw new JWSInvalid('The "b64" (base64url-encode payload) Header Parameter must be a boolean');
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
const { alg } = joseHeader;
|
|
49
|
-
if (typeof alg !== 'string' || !alg) {
|
|
50
|
-
throw new JWSInvalid('JWS "alg" (Algorithm) Header Parameter missing or invalid');
|
|
51
|
-
}
|
|
52
|
-
checkKeyTypeWithJwk(alg, key, 'sign');
|
|
53
|
-
let payload = this._payload;
|
|
54
|
-
if (b64) {
|
|
55
|
-
payload = encoder.encode(base64url(payload));
|
|
56
|
-
}
|
|
57
|
-
let protectedHeader;
|
|
58
|
-
if (this._protectedHeader) {
|
|
59
|
-
protectedHeader = encoder.encode(base64url(JSON.stringify(this._protectedHeader)));
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
protectedHeader = encoder.encode('');
|
|
63
|
-
}
|
|
64
|
-
const data = concat(protectedHeader, encoder.encode('.'), payload);
|
|
65
|
-
const signature = await sign(alg, key, data);
|
|
66
|
-
const jws = {
|
|
67
|
-
signature: base64url(signature),
|
|
68
|
-
payload: '',
|
|
69
|
-
};
|
|
70
|
-
if (b64) {
|
|
71
|
-
jws.payload = decoder.decode(payload);
|
|
72
|
-
}
|
|
73
|
-
if (this._unprotectedHeader) {
|
|
74
|
-
jws.header = this._unprotectedHeader;
|
|
75
|
-
}
|
|
76
|
-
if (this._protectedHeader) {
|
|
77
|
-
jws.protected = decoder.decode(protectedHeader);
|
|
78
|
-
}
|
|
79
|
-
return jws;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { FlattenedSign } from '../flattened/sign.js';
|
|
2
|
-
import { JWSInvalid } from '../../util/errors.js';
|
|
3
|
-
class IndividualSignature {
|
|
4
|
-
constructor(sig, key, options) {
|
|
5
|
-
this.parent = sig;
|
|
6
|
-
this.key = key;
|
|
7
|
-
this.options = options;
|
|
8
|
-
}
|
|
9
|
-
setProtectedHeader(protectedHeader) {
|
|
10
|
-
if (this.protectedHeader) {
|
|
11
|
-
throw new TypeError('setProtectedHeader can only be called once');
|
|
12
|
-
}
|
|
13
|
-
this.protectedHeader = protectedHeader;
|
|
14
|
-
return this;
|
|
15
|
-
}
|
|
16
|
-
setUnprotectedHeader(unprotectedHeader) {
|
|
17
|
-
if (this.unprotectedHeader) {
|
|
18
|
-
throw new TypeError('setUnprotectedHeader can only be called once');
|
|
19
|
-
}
|
|
20
|
-
this.unprotectedHeader = unprotectedHeader;
|
|
21
|
-
return this;
|
|
22
|
-
}
|
|
23
|
-
addSignature(...args) {
|
|
24
|
-
return this.parent.addSignature(...args);
|
|
25
|
-
}
|
|
26
|
-
sign(...args) {
|
|
27
|
-
return this.parent.sign(...args);
|
|
28
|
-
}
|
|
29
|
-
done() {
|
|
30
|
-
return this.parent;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
export class GeneralSign {
|
|
34
|
-
constructor(payload) {
|
|
35
|
-
this._signatures = [];
|
|
36
|
-
this._payload = payload;
|
|
37
|
-
}
|
|
38
|
-
addSignature(key, options) {
|
|
39
|
-
const signature = new IndividualSignature(this, key, options);
|
|
40
|
-
this._signatures.push(signature);
|
|
41
|
-
return signature;
|
|
42
|
-
}
|
|
43
|
-
async sign() {
|
|
44
|
-
if (!this._signatures.length) {
|
|
45
|
-
throw new JWSInvalid('at least one signature must be added');
|
|
46
|
-
}
|
|
47
|
-
const jws = {
|
|
48
|
-
signatures: [],
|
|
49
|
-
payload: '',
|
|
50
|
-
};
|
|
51
|
-
for (let i = 0; i < this._signatures.length; i++) {
|
|
52
|
-
const signature = this._signatures[i];
|
|
53
|
-
const flattened = new FlattenedSign(this._payload);
|
|
54
|
-
flattened.setProtectedHeader(signature.protectedHeader);
|
|
55
|
-
flattened.setUnprotectedHeader(signature.unprotectedHeader);
|
|
56
|
-
const { payload, ...rest } = await flattened.sign(signature.key, signature.options);
|
|
57
|
-
if (i === 0) {
|
|
58
|
-
jws.payload = payload;
|
|
59
|
-
}
|
|
60
|
-
else if (jws.payload !== payload) {
|
|
61
|
-
throw new JWSInvalid('inconsistent use of JWS Unencoded Payload (RFC7797)');
|
|
62
|
-
}
|
|
63
|
-
jws.signatures.push(rest);
|
|
64
|
-
}
|
|
65
|
-
return jws;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { CompactEncrypt } from '../jwe/compact/encrypt.js';
|
|
2
|
-
import { encoder } from '../lib/buffer_utils.js';
|
|
3
|
-
import { ProduceJWT } from './produce.js';
|
|
4
|
-
export class EncryptJWT extends ProduceJWT {
|
|
5
|
-
setProtectedHeader(protectedHeader) {
|
|
6
|
-
if (this._protectedHeader) {
|
|
7
|
-
throw new TypeError('setProtectedHeader can only be called once');
|
|
8
|
-
}
|
|
9
|
-
this._protectedHeader = protectedHeader;
|
|
10
|
-
return this;
|
|
11
|
-
}
|
|
12
|
-
setKeyManagementParameters(parameters) {
|
|
13
|
-
if (this._keyManagementParameters) {
|
|
14
|
-
throw new TypeError('setKeyManagementParameters can only be called once');
|
|
15
|
-
}
|
|
16
|
-
this._keyManagementParameters = parameters;
|
|
17
|
-
return this;
|
|
18
|
-
}
|
|
19
|
-
setContentEncryptionKey(cek) {
|
|
20
|
-
if (this._cek) {
|
|
21
|
-
throw new TypeError('setContentEncryptionKey can only be called once');
|
|
22
|
-
}
|
|
23
|
-
this._cek = cek;
|
|
24
|
-
return this;
|
|
25
|
-
}
|
|
26
|
-
setInitializationVector(iv) {
|
|
27
|
-
if (this._iv) {
|
|
28
|
-
throw new TypeError('setInitializationVector can only be called once');
|
|
29
|
-
}
|
|
30
|
-
this._iv = iv;
|
|
31
|
-
return this;
|
|
32
|
-
}
|
|
33
|
-
replicateIssuerAsHeader() {
|
|
34
|
-
this._replicateIssuerAsHeader = true;
|
|
35
|
-
return this;
|
|
36
|
-
}
|
|
37
|
-
replicateSubjectAsHeader() {
|
|
38
|
-
this._replicateSubjectAsHeader = true;
|
|
39
|
-
return this;
|
|
40
|
-
}
|
|
41
|
-
replicateAudienceAsHeader() {
|
|
42
|
-
this._replicateAudienceAsHeader = true;
|
|
43
|
-
return this;
|
|
44
|
-
}
|
|
45
|
-
async encrypt(key, options) {
|
|
46
|
-
const enc = new CompactEncrypt(encoder.encode(JSON.stringify(this._payload)));
|
|
47
|
-
if (this._replicateIssuerAsHeader) {
|
|
48
|
-
this._protectedHeader = { ...this._protectedHeader, iss: this._payload.iss };
|
|
49
|
-
}
|
|
50
|
-
if (this._replicateSubjectAsHeader) {
|
|
51
|
-
this._protectedHeader = { ...this._protectedHeader, sub: this._payload.sub };
|
|
52
|
-
}
|
|
53
|
-
if (this._replicateAudienceAsHeader) {
|
|
54
|
-
this._protectedHeader = { ...this._protectedHeader, aud: this._payload.aud };
|
|
55
|
-
}
|
|
56
|
-
enc.setProtectedHeader(this._protectedHeader);
|
|
57
|
-
if (this._iv) {
|
|
58
|
-
enc.setInitializationVector(this._iv);
|
|
59
|
-
}
|
|
60
|
-
if (this._cek) {
|
|
61
|
-
enc.setContentEncryptionKey(this._cek);
|
|
62
|
-
}
|
|
63
|
-
if (this._keyManagementParameters) {
|
|
64
|
-
enc.setKeyManagementParameters(this._keyManagementParameters);
|
|
65
|
-
}
|
|
66
|
-
return enc.encrypt(key, options);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import epoch from '../lib/epoch.js';
|
|
2
|
-
import isObject from '../lib/is_object.js';
|
|
3
|
-
import secs from '../lib/secs.js';
|
|
4
|
-
function validateInput(label, input) {
|
|
5
|
-
if (!Number.isFinite(input)) {
|
|
6
|
-
throw new TypeError(`Invalid ${label} input`);
|
|
7
|
-
}
|
|
8
|
-
return input;
|
|
9
|
-
}
|
|
10
|
-
export class ProduceJWT {
|
|
11
|
-
constructor(payload = {}) {
|
|
12
|
-
if (!isObject(payload)) {
|
|
13
|
-
throw new TypeError('JWT Claims Set MUST be an object');
|
|
14
|
-
}
|
|
15
|
-
this._payload = payload;
|
|
16
|
-
}
|
|
17
|
-
setIssuer(issuer) {
|
|
18
|
-
this._payload = { ...this._payload, iss: issuer };
|
|
19
|
-
return this;
|
|
20
|
-
}
|
|
21
|
-
setSubject(subject) {
|
|
22
|
-
this._payload = { ...this._payload, sub: subject };
|
|
23
|
-
return this;
|
|
24
|
-
}
|
|
25
|
-
setAudience(audience) {
|
|
26
|
-
this._payload = { ...this._payload, aud: audience };
|
|
27
|
-
return this;
|
|
28
|
-
}
|
|
29
|
-
setJti(jwtId) {
|
|
30
|
-
this._payload = { ...this._payload, jti: jwtId };
|
|
31
|
-
return this;
|
|
32
|
-
}
|
|
33
|
-
setNotBefore(input) {
|
|
34
|
-
if (typeof input === 'number') {
|
|
35
|
-
this._payload = { ...this._payload, nbf: validateInput('setNotBefore', input) };
|
|
36
|
-
}
|
|
37
|
-
else if (input instanceof Date) {
|
|
38
|
-
this._payload = { ...this._payload, nbf: validateInput('setNotBefore', epoch(input)) };
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
this._payload = { ...this._payload, nbf: epoch(new Date()) + secs(input) };
|
|
42
|
-
}
|
|
43
|
-
return this;
|
|
44
|
-
}
|
|
45
|
-
setExpirationTime(input) {
|
|
46
|
-
if (typeof input === 'number') {
|
|
47
|
-
this._payload = { ...this._payload, exp: validateInput('setExpirationTime', input) };
|
|
48
|
-
}
|
|
49
|
-
else if (input instanceof Date) {
|
|
50
|
-
this._payload = { ...this._payload, exp: validateInput('setExpirationTime', epoch(input)) };
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
this._payload = { ...this._payload, exp: epoch(new Date()) + secs(input) };
|
|
54
|
-
}
|
|
55
|
-
return this;
|
|
56
|
-
}
|
|
57
|
-
setIssuedAt(input) {
|
|
58
|
-
if (typeof input === 'undefined') {
|
|
59
|
-
this._payload = { ...this._payload, iat: epoch(new Date()) };
|
|
60
|
-
}
|
|
61
|
-
else if (input instanceof Date) {
|
|
62
|
-
this._payload = { ...this._payload, iat: validateInput('setIssuedAt', epoch(input)) };
|
|
63
|
-
}
|
|
64
|
-
else if (typeof input === 'string') {
|
|
65
|
-
this._payload = {
|
|
66
|
-
...this._payload,
|
|
67
|
-
iat: validateInput('setIssuedAt', epoch(new Date()) + secs(input)),
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
this._payload = { ...this._payload, iat: validateInput('setIssuedAt', input) };
|
|
72
|
-
}
|
|
73
|
-
return this;
|
|
74
|
-
}
|
|
75
|
-
}
|
package/dist/browser/jwt/sign.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { CompactSign } from '../jws/compact/sign.js';
|
|
2
|
-
import { JWTInvalid } from '../util/errors.js';
|
|
3
|
-
import { encoder } from '../lib/buffer_utils.js';
|
|
4
|
-
import { ProduceJWT } from './produce.js';
|
|
5
|
-
export class SignJWT extends ProduceJWT {
|
|
6
|
-
setProtectedHeader(protectedHeader) {
|
|
7
|
-
this._protectedHeader = protectedHeader;
|
|
8
|
-
return this;
|
|
9
|
-
}
|
|
10
|
-
async sign(key, options) {
|
|
11
|
-
const sig = new CompactSign(encoder.encode(JSON.stringify(this._payload)));
|
|
12
|
-
sig.setProtectedHeader(this._protectedHeader);
|
|
13
|
-
if (Array.isArray(this._protectedHeader?.crit) &&
|
|
14
|
-
this._protectedHeader.crit.includes('b64') &&
|
|
15
|
-
this._protectedHeader.b64 === false) {
|
|
16
|
-
throw new JWTInvalid('JWTs MUST NOT use unencoded payload');
|
|
17
|
-
}
|
|
18
|
-
return sig.sign(key, options);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { toSPKI as exportPublic } from '../runtime/asn1.js';
|
|
2
|
-
import { toPKCS8 as exportPrivate } from '../runtime/asn1.js';
|
|
3
|
-
import keyToJWK from '../runtime/key_to_jwk.js';
|
|
4
|
-
export async function exportSPKI(key) {
|
|
5
|
-
return exportPublic(key);
|
|
6
|
-
}
|
|
7
|
-
export async function exportPKCS8(key) {
|
|
8
|
-
return exportPrivate(key);
|
|
9
|
-
}
|
|
10
|
-
export async function exportJWK(key) {
|
|
11
|
-
return keyToJWK(key);
|
|
12
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import encrypt from '../runtime/encrypt.js';
|
|
2
|
-
import decrypt from '../runtime/decrypt.js';
|
|
3
|
-
import { encode as base64url } from '../runtime/base64url.js';
|
|
4
|
-
export async function wrap(alg, key, cek, iv) {
|
|
5
|
-
const jweAlgorithm = alg.slice(0, 7);
|
|
6
|
-
const wrapped = await encrypt(jweAlgorithm, cek, key, iv, new Uint8Array(0));
|
|
7
|
-
return {
|
|
8
|
-
encryptedKey: wrapped.ciphertext,
|
|
9
|
-
iv: base64url(wrapped.iv),
|
|
10
|
-
tag: base64url(wrapped.tag),
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
export async function unwrap(alg, key, encryptedKey, iv, tag) {
|
|
14
|
-
const jweAlgorithm = alg.slice(0, 7);
|
|
15
|
-
return decrypt(jweAlgorithm, key, encryptedKey, iv, tag, new Uint8Array(0));
|
|
16
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { withAlg as invalidKeyInput } from './invalid_key_input.js';
|
|
2
|
-
import isKeyLike, { types } from '../runtime/is_key_like.js';
|
|
3
|
-
import * as jwk from './is_jwk.js';
|
|
4
|
-
const tag = (key) => key?.[Symbol.toStringTag];
|
|
5
|
-
const jwkMatchesOp = (alg, key, usage) => {
|
|
6
|
-
if (key.use !== undefined && key.use !== 'sig') {
|
|
7
|
-
throw new TypeError('Invalid key for this operation, when present its use must be sig');
|
|
8
|
-
}
|
|
9
|
-
if (key.key_ops !== undefined && key.key_ops.includes?.(usage) !== true) {
|
|
10
|
-
throw new TypeError(`Invalid key for this operation, when present its key_ops must include ${usage}`);
|
|
11
|
-
}
|
|
12
|
-
if (key.alg !== undefined && key.alg !== alg) {
|
|
13
|
-
throw new TypeError(`Invalid key for this operation, when present its alg must be ${alg}`);
|
|
14
|
-
}
|
|
15
|
-
return true;
|
|
16
|
-
};
|
|
17
|
-
const symmetricTypeCheck = (alg, key, usage, allowJwk) => {
|
|
18
|
-
if (key instanceof Uint8Array)
|
|
19
|
-
return;
|
|
20
|
-
if (allowJwk && jwk.isJWK(key)) {
|
|
21
|
-
if (jwk.isSecretJWK(key) && jwkMatchesOp(alg, key, usage))
|
|
22
|
-
return;
|
|
23
|
-
throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK "kty" (Key Type) equal to "oct" and the JWK "k" (Key Value) present`);
|
|
24
|
-
}
|
|
25
|
-
if (!isKeyLike(key)) {
|
|
26
|
-
throw new TypeError(invalidKeyInput(alg, key, ...types, 'Uint8Array', allowJwk ? 'JSON Web Key' : null));
|
|
27
|
-
}
|
|
28
|
-
if (key.type !== 'secret') {
|
|
29
|
-
throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type "secret"`);
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
const asymmetricTypeCheck = (alg, key, usage, allowJwk) => {
|
|
33
|
-
if (allowJwk && jwk.isJWK(key)) {
|
|
34
|
-
switch (usage) {
|
|
35
|
-
case 'sign':
|
|
36
|
-
if (jwk.isPrivateJWK(key) && jwkMatchesOp(alg, key, usage))
|
|
37
|
-
return;
|
|
38
|
-
throw new TypeError(`JSON Web Key for this operation be a private JWK`);
|
|
39
|
-
case 'verify':
|
|
40
|
-
if (jwk.isPublicJWK(key) && jwkMatchesOp(alg, key, usage))
|
|
41
|
-
return;
|
|
42
|
-
throw new TypeError(`JSON Web Key for this operation be a public JWK`);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
if (!isKeyLike(key)) {
|
|
46
|
-
throw new TypeError(invalidKeyInput(alg, key, ...types, allowJwk ? 'JSON Web Key' : null));
|
|
47
|
-
}
|
|
48
|
-
if (key.type === 'secret') {
|
|
49
|
-
throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type "secret"`);
|
|
50
|
-
}
|
|
51
|
-
if (usage === 'sign' && key.type === 'public') {
|
|
52
|
-
throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type "private"`);
|
|
53
|
-
}
|
|
54
|
-
if (usage === 'decrypt' && key.type === 'public') {
|
|
55
|
-
throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type "private"`);
|
|
56
|
-
}
|
|
57
|
-
if (key.algorithm && usage === 'verify' && key.type === 'private') {
|
|
58
|
-
throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type "public"`);
|
|
59
|
-
}
|
|
60
|
-
if (key.algorithm && usage === 'encrypt' && key.type === 'private') {
|
|
61
|
-
throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type "public"`);
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
function checkKeyType(allowJwk, alg, key, usage) {
|
|
65
|
-
const symmetric = alg.startsWith('HS') ||
|
|
66
|
-
alg === 'dir' ||
|
|
67
|
-
alg.startsWith('PBES2') ||
|
|
68
|
-
/^A\d{3}(?:GCM)?KW$/.test(alg);
|
|
69
|
-
if (symmetric) {
|
|
70
|
-
symmetricTypeCheck(alg, key, usage, allowJwk);
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
asymmetricTypeCheck(alg, key, usage, allowJwk);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
export default checkKeyType.bind(undefined, false);
|
|
77
|
-
export const checkKeyTypeWithJwk = checkKeyType.bind(undefined, true);
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
function unusable(name, prop = 'algorithm.name') {
|
|
2
|
-
return new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`);
|
|
3
|
-
}
|
|
4
|
-
function isAlgorithm(algorithm, name) {
|
|
5
|
-
return algorithm.name === name;
|
|
6
|
-
}
|
|
7
|
-
function getHashLength(hash) {
|
|
8
|
-
return parseInt(hash.name.slice(4), 10);
|
|
9
|
-
}
|
|
10
|
-
function getNamedCurve(alg) {
|
|
11
|
-
switch (alg) {
|
|
12
|
-
case 'ES256':
|
|
13
|
-
return 'P-256';
|
|
14
|
-
case 'ES384':
|
|
15
|
-
return 'P-384';
|
|
16
|
-
case 'ES512':
|
|
17
|
-
return 'P-521';
|
|
18
|
-
default:
|
|
19
|
-
throw new Error('unreachable');
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function checkUsage(key, usages) {
|
|
23
|
-
if (usages.length && !usages.some((expected) => key.usages.includes(expected))) {
|
|
24
|
-
let msg = 'CryptoKey does not support this operation, its usages must include ';
|
|
25
|
-
if (usages.length > 2) {
|
|
26
|
-
const last = usages.pop();
|
|
27
|
-
msg += `one of ${usages.join(', ')}, or ${last}.`;
|
|
28
|
-
}
|
|
29
|
-
else if (usages.length === 2) {
|
|
30
|
-
msg += `one of ${usages[0]} or ${usages[1]}.`;
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
msg += `${usages[0]}.`;
|
|
34
|
-
}
|
|
35
|
-
throw new TypeError(msg);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
export function checkSigCryptoKey(key, alg, ...usages) {
|
|
39
|
-
switch (alg) {
|
|
40
|
-
case 'HS256':
|
|
41
|
-
case 'HS384':
|
|
42
|
-
case 'HS512': {
|
|
43
|
-
if (!isAlgorithm(key.algorithm, 'HMAC'))
|
|
44
|
-
throw unusable('HMAC');
|
|
45
|
-
const expected = parseInt(alg.slice(2), 10);
|
|
46
|
-
const actual = getHashLength(key.algorithm.hash);
|
|
47
|
-
if (actual !== expected)
|
|
48
|
-
throw unusable(`SHA-${expected}`, 'algorithm.hash');
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
51
|
-
case 'RS256':
|
|
52
|
-
case 'RS384':
|
|
53
|
-
case 'RS512': {
|
|
54
|
-
if (!isAlgorithm(key.algorithm, 'RSASSA-PKCS1-v1_5'))
|
|
55
|
-
throw unusable('RSASSA-PKCS1-v1_5');
|
|
56
|
-
const expected = parseInt(alg.slice(2), 10);
|
|
57
|
-
const actual = getHashLength(key.algorithm.hash);
|
|
58
|
-
if (actual !== expected)
|
|
59
|
-
throw unusable(`SHA-${expected}`, 'algorithm.hash');
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
case 'PS256':
|
|
63
|
-
case 'PS384':
|
|
64
|
-
case 'PS512': {
|
|
65
|
-
if (!isAlgorithm(key.algorithm, 'RSA-PSS'))
|
|
66
|
-
throw unusable('RSA-PSS');
|
|
67
|
-
const expected = parseInt(alg.slice(2), 10);
|
|
68
|
-
const actual = getHashLength(key.algorithm.hash);
|
|
69
|
-
if (actual !== expected)
|
|
70
|
-
throw unusable(`SHA-${expected}`, 'algorithm.hash');
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
case 'EdDSA': {
|
|
74
|
-
if (key.algorithm.name !== 'Ed25519' && key.algorithm.name !== 'Ed448') {
|
|
75
|
-
throw unusable('Ed25519 or Ed448');
|
|
76
|
-
}
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
case 'Ed25519': {
|
|
80
|
-
if (!isAlgorithm(key.algorithm, 'Ed25519'))
|
|
81
|
-
throw unusable('Ed25519');
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
case 'ES256':
|
|
85
|
-
case 'ES384':
|
|
86
|
-
case 'ES512': {
|
|
87
|
-
if (!isAlgorithm(key.algorithm, 'ECDSA'))
|
|
88
|
-
throw unusable('ECDSA');
|
|
89
|
-
const expected = getNamedCurve(alg);
|
|
90
|
-
const actual = key.algorithm.namedCurve;
|
|
91
|
-
if (actual !== expected)
|
|
92
|
-
throw unusable(expected, 'algorithm.namedCurve');
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
default:
|
|
96
|
-
throw new TypeError('CryptoKey does not support this operation');
|
|
97
|
-
}
|
|
98
|
-
checkUsage(key, usages);
|
|
99
|
-
}
|
|
100
|
-
export function checkEncCryptoKey(key, alg, ...usages) {
|
|
101
|
-
switch (alg) {
|
|
102
|
-
case 'A128GCM':
|
|
103
|
-
case 'A192GCM':
|
|
104
|
-
case 'A256GCM': {
|
|
105
|
-
if (!isAlgorithm(key.algorithm, 'AES-GCM'))
|
|
106
|
-
throw unusable('AES-GCM');
|
|
107
|
-
const expected = parseInt(alg.slice(1, 4), 10);
|
|
108
|
-
const actual = key.algorithm.length;
|
|
109
|
-
if (actual !== expected)
|
|
110
|
-
throw unusable(expected, 'algorithm.length');
|
|
111
|
-
break;
|
|
112
|
-
}
|
|
113
|
-
case 'A128KW':
|
|
114
|
-
case 'A192KW':
|
|
115
|
-
case 'A256KW': {
|
|
116
|
-
if (!isAlgorithm(key.algorithm, 'AES-KW'))
|
|
117
|
-
throw unusable('AES-KW');
|
|
118
|
-
const expected = parseInt(alg.slice(1, 4), 10);
|
|
119
|
-
const actual = key.algorithm.length;
|
|
120
|
-
if (actual !== expected)
|
|
121
|
-
throw unusable(expected, 'algorithm.length');
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
case 'ECDH': {
|
|
125
|
-
switch (key.algorithm.name) {
|
|
126
|
-
case 'ECDH':
|
|
127
|
-
case 'X25519':
|
|
128
|
-
case 'X448':
|
|
129
|
-
break;
|
|
130
|
-
default:
|
|
131
|
-
throw unusable('ECDH, X25519, or X448');
|
|
132
|
-
}
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
case 'PBES2-HS256+A128KW':
|
|
136
|
-
case 'PBES2-HS384+A192KW':
|
|
137
|
-
case 'PBES2-HS512+A256KW':
|
|
138
|
-
if (!isAlgorithm(key.algorithm, 'PBKDF2'))
|
|
139
|
-
throw unusable('PBKDF2');
|
|
140
|
-
break;
|
|
141
|
-
case 'RSA-OAEP':
|
|
142
|
-
case 'RSA-OAEP-256':
|
|
143
|
-
case 'RSA-OAEP-384':
|
|
144
|
-
case 'RSA-OAEP-512': {
|
|
145
|
-
if (!isAlgorithm(key.algorithm, 'RSA-OAEP'))
|
|
146
|
-
throw unusable('RSA-OAEP');
|
|
147
|
-
const expected = parseInt(alg.slice(9), 10) || 1;
|
|
148
|
-
const actual = getHashLength(key.algorithm.hash);
|
|
149
|
-
if (actual !== expected)
|
|
150
|
-
throw unusable(`SHA-${expected}`, 'algorithm.hash');
|
|
151
|
-
break;
|
|
152
|
-
}
|
|
153
|
-
default:
|
|
154
|
-
throw new TypeError('CryptoKey does not support this operation');
|
|
155
|
-
}
|
|
156
|
-
checkUsage(key, usages);
|
|
157
|
-
}
|