jose 5.10.0 → 6.0.0
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 +5 -5
- 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 +4 -4
- package/dist/types/jwt/produce.d.ts +3 -3
- package/dist/types/jwt/sign.d.ts +3 -3
- package/dist/types/jwt/unsecured.d.ts +5 -5
- 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,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const crypto = require("node:crypto");
|
|
4
|
-
const node_util_1 = require("node:util");
|
|
5
|
-
const dsa_digest_js_1 = require("./dsa_digest.js");
|
|
6
|
-
const hmac_digest_js_1 = require("./hmac_digest.js");
|
|
7
|
-
const node_key_js_1 = require("./node_key.js");
|
|
8
|
-
const get_sign_verify_key_js_1 = require("./get_sign_verify_key.js");
|
|
9
|
-
const oneShotSign = (0, node_util_1.promisify)(crypto.sign);
|
|
10
|
-
const sign = async (alg, key, data) => {
|
|
11
|
-
const k = (0, get_sign_verify_key_js_1.default)(alg, key, 'sign');
|
|
12
|
-
if (alg.startsWith('HS')) {
|
|
13
|
-
const hmac = crypto.createHmac((0, hmac_digest_js_1.default)(alg), k);
|
|
14
|
-
hmac.update(data);
|
|
15
|
-
return hmac.digest();
|
|
16
|
-
}
|
|
17
|
-
return oneShotSign((0, dsa_digest_js_1.default)(alg), data, (0, node_key_js_1.default)(alg, k));
|
|
18
|
-
};
|
|
19
|
-
exports.default = sign;
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const crypto = require("node:crypto");
|
|
4
|
-
const node_util_1 = require("node:util");
|
|
5
|
-
const dsa_digest_js_1 = require("./dsa_digest.js");
|
|
6
|
-
const node_key_js_1 = require("./node_key.js");
|
|
7
|
-
const sign_js_1 = require("./sign.js");
|
|
8
|
-
const get_sign_verify_key_js_1 = require("./get_sign_verify_key.js");
|
|
9
|
-
const oneShotVerify = (0, node_util_1.promisify)(crypto.verify);
|
|
10
|
-
const verify = async (alg, key, signature, data) => {
|
|
11
|
-
const k = (0, get_sign_verify_key_js_1.default)(alg, key, 'verify');
|
|
12
|
-
if (alg.startsWith('HS')) {
|
|
13
|
-
const expected = await (0, sign_js_1.default)(alg, k, data);
|
|
14
|
-
const actual = signature;
|
|
15
|
-
try {
|
|
16
|
-
return crypto.timingSafeEqual(actual, expected);
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
const algorithm = (0, dsa_digest_js_1.default)(alg);
|
|
23
|
-
const keyInput = (0, node_key_js_1.default)(alg, k);
|
|
24
|
-
try {
|
|
25
|
-
return await oneShotVerify(algorithm, data, keyInput, signature);
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
exports.default = verify;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isCryptoKey = void 0;
|
|
4
|
-
const crypto = require("node:crypto");
|
|
5
|
-
const util = require("node:util");
|
|
6
|
-
const webcrypto = crypto.webcrypto;
|
|
7
|
-
exports.default = webcrypto;
|
|
8
|
-
const isCryptoKey = (key) => util.types.isCryptoKey(key);
|
|
9
|
-
exports.isCryptoKey = isCryptoKey;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.decodeJwt = decodeJwt;
|
|
4
|
-
const base64url_js_1 = require("./base64url.js");
|
|
5
|
-
const buffer_utils_js_1 = require("../lib/buffer_utils.js");
|
|
6
|
-
const is_object_js_1 = require("../lib/is_object.js");
|
|
7
|
-
const errors_js_1 = require("./errors.js");
|
|
8
|
-
function decodeJwt(jwt) {
|
|
9
|
-
if (typeof jwt !== 'string')
|
|
10
|
-
throw new errors_js_1.JWTInvalid('JWTs must use Compact JWS serialization, JWT must be a string');
|
|
11
|
-
const { 1: payload, length } = jwt.split('.');
|
|
12
|
-
if (length === 5)
|
|
13
|
-
throw new errors_js_1.JWTInvalid('Only JWTs using Compact JWS serialization can be decoded');
|
|
14
|
-
if (length !== 3)
|
|
15
|
-
throw new errors_js_1.JWTInvalid('Invalid JWT');
|
|
16
|
-
if (!payload)
|
|
17
|
-
throw new errors_js_1.JWTInvalid('JWTs must contain a payload');
|
|
18
|
-
let decoded;
|
|
19
|
-
try {
|
|
20
|
-
decoded = (0, base64url_js_1.decode)(payload);
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
throw new errors_js_1.JWTInvalid('Failed to base64url decode the payload');
|
|
24
|
-
}
|
|
25
|
-
let result;
|
|
26
|
-
try {
|
|
27
|
-
result = JSON.parse(buffer_utils_js_1.decoder.decode(decoded));
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
throw new errors_js_1.JWTInvalid('Failed to parse the decoded payload as JSON');
|
|
31
|
-
}
|
|
32
|
-
if (!(0, is_object_js_1.default)(result))
|
|
33
|
-
throw new errors_js_1.JWTInvalid('Invalid JWT Claims Set');
|
|
34
|
-
return result;
|
|
35
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.decodeProtectedHeader = decodeProtectedHeader;
|
|
4
|
-
const base64url_js_1 = require("./base64url.js");
|
|
5
|
-
const buffer_utils_js_1 = require("../lib/buffer_utils.js");
|
|
6
|
-
const is_object_js_1 = require("../lib/is_object.js");
|
|
7
|
-
function decodeProtectedHeader(token) {
|
|
8
|
-
let protectedB64u;
|
|
9
|
-
if (typeof token === 'string') {
|
|
10
|
-
const parts = token.split('.');
|
|
11
|
-
if (parts.length === 3 || parts.length === 5) {
|
|
12
|
-
;
|
|
13
|
-
[protectedB64u] = parts;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
else if (typeof token === 'object' && token) {
|
|
17
|
-
if ('protected' in token) {
|
|
18
|
-
protectedB64u = token.protected;
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
throw new TypeError('Token does not contain a Protected Header');
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
try {
|
|
25
|
-
if (typeof protectedB64u !== 'string' || !protectedB64u) {
|
|
26
|
-
throw new Error();
|
|
27
|
-
}
|
|
28
|
-
const result = JSON.parse(buffer_utils_js_1.decoder.decode((0, base64url_js_1.decode)(protectedB64u)));
|
|
29
|
-
if (!(0, is_object_js_1.default)(result)) {
|
|
30
|
-
throw new Error();
|
|
31
|
-
}
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
throw new TypeError('Invalid Token or Protected Header formatting');
|
|
36
|
-
}
|
|
37
|
-
}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.JWSSignatureVerificationFailed = exports.JWKSTimeout = exports.JWKSMultipleMatchingKeys = exports.JWKSNoMatchingKey = exports.JWKSInvalid = exports.JWKInvalid = exports.JWTInvalid = exports.JWSInvalid = exports.JWEInvalid = exports.JWEDecryptionFailed = exports.JOSENotSupported = exports.JOSEAlgNotAllowed = exports.JWTExpired = exports.JWTClaimValidationFailed = exports.JOSEError = void 0;
|
|
4
|
-
class JOSEError extends Error {
|
|
5
|
-
static code = 'ERR_JOSE_GENERIC';
|
|
6
|
-
code = 'ERR_JOSE_GENERIC';
|
|
7
|
-
constructor(message, options) {
|
|
8
|
-
super(message, options);
|
|
9
|
-
this.name = this.constructor.name;
|
|
10
|
-
Error.captureStackTrace?.(this, this.constructor);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
exports.JOSEError = JOSEError;
|
|
14
|
-
class JWTClaimValidationFailed extends JOSEError {
|
|
15
|
-
static code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';
|
|
16
|
-
code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';
|
|
17
|
-
claim;
|
|
18
|
-
reason;
|
|
19
|
-
payload;
|
|
20
|
-
constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {
|
|
21
|
-
super(message, { cause: { claim, reason, payload } });
|
|
22
|
-
this.claim = claim;
|
|
23
|
-
this.reason = reason;
|
|
24
|
-
this.payload = payload;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
exports.JWTClaimValidationFailed = JWTClaimValidationFailed;
|
|
28
|
-
class JWTExpired extends JOSEError {
|
|
29
|
-
static code = 'ERR_JWT_EXPIRED';
|
|
30
|
-
code = 'ERR_JWT_EXPIRED';
|
|
31
|
-
claim;
|
|
32
|
-
reason;
|
|
33
|
-
payload;
|
|
34
|
-
constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {
|
|
35
|
-
super(message, { cause: { claim, reason, payload } });
|
|
36
|
-
this.claim = claim;
|
|
37
|
-
this.reason = reason;
|
|
38
|
-
this.payload = payload;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
exports.JWTExpired = JWTExpired;
|
|
42
|
-
class JOSEAlgNotAllowed extends JOSEError {
|
|
43
|
-
static code = 'ERR_JOSE_ALG_NOT_ALLOWED';
|
|
44
|
-
code = 'ERR_JOSE_ALG_NOT_ALLOWED';
|
|
45
|
-
}
|
|
46
|
-
exports.JOSEAlgNotAllowed = JOSEAlgNotAllowed;
|
|
47
|
-
class JOSENotSupported extends JOSEError {
|
|
48
|
-
static code = 'ERR_JOSE_NOT_SUPPORTED';
|
|
49
|
-
code = 'ERR_JOSE_NOT_SUPPORTED';
|
|
50
|
-
}
|
|
51
|
-
exports.JOSENotSupported = JOSENotSupported;
|
|
52
|
-
class JWEDecryptionFailed extends JOSEError {
|
|
53
|
-
static code = 'ERR_JWE_DECRYPTION_FAILED';
|
|
54
|
-
code = 'ERR_JWE_DECRYPTION_FAILED';
|
|
55
|
-
constructor(message = 'decryption operation failed', options) {
|
|
56
|
-
super(message, options);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
exports.JWEDecryptionFailed = JWEDecryptionFailed;
|
|
60
|
-
class JWEInvalid extends JOSEError {
|
|
61
|
-
static code = 'ERR_JWE_INVALID';
|
|
62
|
-
code = 'ERR_JWE_INVALID';
|
|
63
|
-
}
|
|
64
|
-
exports.JWEInvalid = JWEInvalid;
|
|
65
|
-
class JWSInvalid extends JOSEError {
|
|
66
|
-
static code = 'ERR_JWS_INVALID';
|
|
67
|
-
code = 'ERR_JWS_INVALID';
|
|
68
|
-
}
|
|
69
|
-
exports.JWSInvalid = JWSInvalid;
|
|
70
|
-
class JWTInvalid extends JOSEError {
|
|
71
|
-
static code = 'ERR_JWT_INVALID';
|
|
72
|
-
code = 'ERR_JWT_INVALID';
|
|
73
|
-
}
|
|
74
|
-
exports.JWTInvalid = JWTInvalid;
|
|
75
|
-
class JWKInvalid extends JOSEError {
|
|
76
|
-
static code = 'ERR_JWK_INVALID';
|
|
77
|
-
code = 'ERR_JWK_INVALID';
|
|
78
|
-
}
|
|
79
|
-
exports.JWKInvalid = JWKInvalid;
|
|
80
|
-
class JWKSInvalid extends JOSEError {
|
|
81
|
-
static code = 'ERR_JWKS_INVALID';
|
|
82
|
-
code = 'ERR_JWKS_INVALID';
|
|
83
|
-
}
|
|
84
|
-
exports.JWKSInvalid = JWKSInvalid;
|
|
85
|
-
class JWKSNoMatchingKey extends JOSEError {
|
|
86
|
-
static code = 'ERR_JWKS_NO_MATCHING_KEY';
|
|
87
|
-
code = 'ERR_JWKS_NO_MATCHING_KEY';
|
|
88
|
-
constructor(message = 'no applicable key found in the JSON Web Key Set', options) {
|
|
89
|
-
super(message, options);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
exports.JWKSNoMatchingKey = JWKSNoMatchingKey;
|
|
93
|
-
class JWKSMultipleMatchingKeys extends JOSEError {
|
|
94
|
-
[Symbol.asyncIterator];
|
|
95
|
-
static code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';
|
|
96
|
-
code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';
|
|
97
|
-
constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {
|
|
98
|
-
super(message, options);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
exports.JWKSMultipleMatchingKeys = JWKSMultipleMatchingKeys;
|
|
102
|
-
class JWKSTimeout extends JOSEError {
|
|
103
|
-
static code = 'ERR_JWKS_TIMEOUT';
|
|
104
|
-
code = 'ERR_JWKS_TIMEOUT';
|
|
105
|
-
constructor(message = 'request timed out', options) {
|
|
106
|
-
super(message, options);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
exports.JWKSTimeout = JWKSTimeout;
|
|
110
|
-
class JWSSignatureVerificationFailed extends JOSEError {
|
|
111
|
-
static code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';
|
|
112
|
-
code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';
|
|
113
|
-
constructor(message = 'signature verification failed', options) {
|
|
114
|
-
super(message, options);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
exports.JWSSignatureVerificationFailed = JWSSignatureVerificationFailed;
|
package/dist/node/esm/index.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export { compactDecrypt } from './jwe/compact/decrypt.js';
|
|
2
|
-
export { flattenedDecrypt } from './jwe/flattened/decrypt.js';
|
|
3
|
-
export { generalDecrypt } from './jwe/general/decrypt.js';
|
|
4
|
-
export { GeneralEncrypt } from './jwe/general/encrypt.js';
|
|
5
|
-
export { compactVerify } from './jws/compact/verify.js';
|
|
6
|
-
export { flattenedVerify } from './jws/flattened/verify.js';
|
|
7
|
-
export { generalVerify } from './jws/general/verify.js';
|
|
8
|
-
export { jwtVerify } from './jwt/verify.js';
|
|
9
|
-
export { jwtDecrypt } from './jwt/decrypt.js';
|
|
10
|
-
export { CompactEncrypt } from './jwe/compact/encrypt.js';
|
|
11
|
-
export { FlattenedEncrypt } from './jwe/flattened/encrypt.js';
|
|
12
|
-
export { CompactSign } from './jws/compact/sign.js';
|
|
13
|
-
export { FlattenedSign } from './jws/flattened/sign.js';
|
|
14
|
-
export { GeneralSign } from './jws/general/sign.js';
|
|
15
|
-
export { SignJWT } from './jwt/sign.js';
|
|
16
|
-
export { EncryptJWT } from './jwt/encrypt.js';
|
|
17
|
-
export { calculateJwkThumbprint, calculateJwkThumbprintUri } from './jwk/thumbprint.js';
|
|
18
|
-
export { EmbeddedJWK } from './jwk/embedded.js';
|
|
19
|
-
export { createLocalJWKSet } from './jwks/local.js';
|
|
20
|
-
export { createRemoteJWKSet, jwksCache, experimental_jwksCache } from './jwks/remote.js';
|
|
21
|
-
export { UnsecuredJWT } from './jwt/unsecured.js';
|
|
22
|
-
export { exportPKCS8, exportSPKI, exportJWK } from './key/export.js';
|
|
23
|
-
export { importSPKI, importPKCS8, importX509, importJWK } from './key/import.js';
|
|
24
|
-
export { decodeProtectedHeader } from './util/decode_protected_header.js';
|
|
25
|
-
export { decodeJwt } from './util/decode_jwt.js';
|
|
26
|
-
export * as errors from './util/errors.js';
|
|
27
|
-
export { generateKeyPair } from './key/generate_key_pair.js';
|
|
28
|
-
export { generateSecret } from './key/generate_secret.js';
|
|
29
|
-
export * as base64url from './util/base64url.js';
|
|
30
|
-
export { default as cryptoRuntime } from './util/runtime.js';
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { flattenedDecrypt } from '../flattened/decrypt.js';
|
|
2
|
-
import { JWEInvalid } from '../../util/errors.js';
|
|
3
|
-
import { decoder } from '../../lib/buffer_utils.js';
|
|
4
|
-
export async function compactDecrypt(jwe, key, options) {
|
|
5
|
-
if (jwe instanceof Uint8Array) {
|
|
6
|
-
jwe = decoder.decode(jwe);
|
|
7
|
-
}
|
|
8
|
-
if (typeof jwe !== 'string') {
|
|
9
|
-
throw new JWEInvalid('Compact JWE must be a string or Uint8Array');
|
|
10
|
-
}
|
|
11
|
-
const { 0: protectedHeader, 1: encryptedKey, 2: iv, 3: ciphertext, 4: tag, length, } = jwe.split('.');
|
|
12
|
-
if (length !== 5) {
|
|
13
|
-
throw new JWEInvalid('Invalid Compact JWE');
|
|
14
|
-
}
|
|
15
|
-
const decrypted = await flattenedDecrypt({
|
|
16
|
-
ciphertext,
|
|
17
|
-
iv: iv || undefined,
|
|
18
|
-
protected: protectedHeader,
|
|
19
|
-
tag: tag || undefined,
|
|
20
|
-
encrypted_key: encryptedKey || undefined,
|
|
21
|
-
}, key, options);
|
|
22
|
-
const result = { plaintext: decrypted.plaintext, protectedHeader: decrypted.protectedHeader };
|
|
23
|
-
if (typeof key === 'function') {
|
|
24
|
-
return { ...result, key: decrypted.key };
|
|
25
|
-
}
|
|
26
|
-
return result;
|
|
27
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { flattenedDecrypt } from '../flattened/decrypt.js';
|
|
2
|
-
import { JWEDecryptionFailed, JWEInvalid } from '../../util/errors.js';
|
|
3
|
-
import isObject from '../../lib/is_object.js';
|
|
4
|
-
export async function generalDecrypt(jwe, key, options) {
|
|
5
|
-
if (!isObject(jwe)) {
|
|
6
|
-
throw new JWEInvalid('General JWE must be an object');
|
|
7
|
-
}
|
|
8
|
-
if (!Array.isArray(jwe.recipients) || !jwe.recipients.every(isObject)) {
|
|
9
|
-
throw new JWEInvalid('JWE Recipients missing or incorrect type');
|
|
10
|
-
}
|
|
11
|
-
if (!jwe.recipients.length) {
|
|
12
|
-
throw new JWEInvalid('JWE Recipients has no members');
|
|
13
|
-
}
|
|
14
|
-
for (const recipient of jwe.recipients) {
|
|
15
|
-
try {
|
|
16
|
-
return await flattenedDecrypt({
|
|
17
|
-
aad: jwe.aad,
|
|
18
|
-
ciphertext: jwe.ciphertext,
|
|
19
|
-
encrypted_key: recipient.encrypted_key,
|
|
20
|
-
header: recipient.header,
|
|
21
|
-
iv: jwe.iv,
|
|
22
|
-
protected: jwe.protected,
|
|
23
|
-
tag: jwe.tag,
|
|
24
|
-
unprotected: jwe.unprotected,
|
|
25
|
-
}, key, options);
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
throw new JWEDecryptionFailed();
|
|
31
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { importJWK } from '../key/import.js';
|
|
2
|
-
import isObject from '../lib/is_object.js';
|
|
3
|
-
import { JWSInvalid } from '../util/errors.js';
|
|
4
|
-
export async function EmbeddedJWK(protectedHeader, token) {
|
|
5
|
-
const joseHeader = {
|
|
6
|
-
...protectedHeader,
|
|
7
|
-
...token?.header,
|
|
8
|
-
};
|
|
9
|
-
if (!isObject(joseHeader.jwk)) {
|
|
10
|
-
throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a JSON object');
|
|
11
|
-
}
|
|
12
|
-
const key = await importJWK({ ...joseHeader.jwk, ext: true }, joseHeader.alg);
|
|
13
|
-
if (key instanceof Uint8Array || key.type !== 'public') {
|
|
14
|
-
throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a public key');
|
|
15
|
-
}
|
|
16
|
-
return key;
|
|
17
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { flattenedVerify } from '../flattened/verify.js';
|
|
2
|
-
import { JWSInvalid } from '../../util/errors.js';
|
|
3
|
-
import { decoder } from '../../lib/buffer_utils.js';
|
|
4
|
-
export async function compactVerify(jws, key, options) {
|
|
5
|
-
if (jws instanceof Uint8Array) {
|
|
6
|
-
jws = decoder.decode(jws);
|
|
7
|
-
}
|
|
8
|
-
if (typeof jws !== 'string') {
|
|
9
|
-
throw new JWSInvalid('Compact JWS must be a string or Uint8Array');
|
|
10
|
-
}
|
|
11
|
-
const { 0: protectedHeader, 1: payload, 2: signature, length } = jws.split('.');
|
|
12
|
-
if (length !== 3) {
|
|
13
|
-
throw new JWSInvalid('Invalid Compact JWS');
|
|
14
|
-
}
|
|
15
|
-
const verified = await flattenedVerify({ payload, protected: protectedHeader, signature }, key, options);
|
|
16
|
-
const result = { payload: verified.payload, protectedHeader: verified.protectedHeader };
|
|
17
|
-
if (typeof key === 'function') {
|
|
18
|
-
return { ...result, key: verified.key };
|
|
19
|
-
}
|
|
20
|
-
return result;
|
|
21
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { decode as base64url } from '../../runtime/base64url.js';
|
|
2
|
-
import verify from '../../runtime/verify.js';
|
|
3
|
-
import { JOSEAlgNotAllowed, JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';
|
|
4
|
-
import { concat, encoder, decoder } from '../../lib/buffer_utils.js';
|
|
5
|
-
import isDisjoint from '../../lib/is_disjoint.js';
|
|
6
|
-
import isObject from '../../lib/is_object.js';
|
|
7
|
-
import { checkKeyTypeWithJwk } from '../../lib/check_key_type.js';
|
|
8
|
-
import validateCrit from '../../lib/validate_crit.js';
|
|
9
|
-
import validateAlgorithms from '../../lib/validate_algorithms.js';
|
|
10
|
-
import { isJWK } from '../../lib/is_jwk.js';
|
|
11
|
-
import { importJWK } from '../../key/import.js';
|
|
12
|
-
export async function flattenedVerify(jws, key, options) {
|
|
13
|
-
if (!isObject(jws)) {
|
|
14
|
-
throw new JWSInvalid('Flattened JWS must be an object');
|
|
15
|
-
}
|
|
16
|
-
if (jws.protected === undefined && jws.header === undefined) {
|
|
17
|
-
throw new JWSInvalid('Flattened JWS must have either of the "protected" or "header" members');
|
|
18
|
-
}
|
|
19
|
-
if (jws.protected !== undefined && typeof jws.protected !== 'string') {
|
|
20
|
-
throw new JWSInvalid('JWS Protected Header incorrect type');
|
|
21
|
-
}
|
|
22
|
-
if (jws.payload === undefined) {
|
|
23
|
-
throw new JWSInvalid('JWS Payload missing');
|
|
24
|
-
}
|
|
25
|
-
if (typeof jws.signature !== 'string') {
|
|
26
|
-
throw new JWSInvalid('JWS Signature missing or incorrect type');
|
|
27
|
-
}
|
|
28
|
-
if (jws.header !== undefined && !isObject(jws.header)) {
|
|
29
|
-
throw new JWSInvalid('JWS Unprotected Header incorrect type');
|
|
30
|
-
}
|
|
31
|
-
let parsedProt = {};
|
|
32
|
-
if (jws.protected) {
|
|
33
|
-
try {
|
|
34
|
-
const protectedHeader = base64url(jws.protected);
|
|
35
|
-
parsedProt = JSON.parse(decoder.decode(protectedHeader));
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
throw new JWSInvalid('JWS Protected Header is invalid');
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
if (!isDisjoint(parsedProt, jws.header)) {
|
|
42
|
-
throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');
|
|
43
|
-
}
|
|
44
|
-
const joseHeader = {
|
|
45
|
-
...parsedProt,
|
|
46
|
-
...jws.header,
|
|
47
|
-
};
|
|
48
|
-
const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, parsedProt, joseHeader);
|
|
49
|
-
let b64 = true;
|
|
50
|
-
if (extensions.has('b64')) {
|
|
51
|
-
b64 = parsedProt.b64;
|
|
52
|
-
if (typeof b64 !== 'boolean') {
|
|
53
|
-
throw new JWSInvalid('The "b64" (base64url-encode payload) Header Parameter must be a boolean');
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
const { alg } = joseHeader;
|
|
57
|
-
if (typeof alg !== 'string' || !alg) {
|
|
58
|
-
throw new JWSInvalid('JWS "alg" (Algorithm) Header Parameter missing or invalid');
|
|
59
|
-
}
|
|
60
|
-
const algorithms = options && validateAlgorithms('algorithms', options.algorithms);
|
|
61
|
-
if (algorithms && !algorithms.has(alg)) {
|
|
62
|
-
throw new JOSEAlgNotAllowed('"alg" (Algorithm) Header Parameter value not allowed');
|
|
63
|
-
}
|
|
64
|
-
if (b64) {
|
|
65
|
-
if (typeof jws.payload !== 'string') {
|
|
66
|
-
throw new JWSInvalid('JWS Payload must be a string');
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) {
|
|
70
|
-
throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');
|
|
71
|
-
}
|
|
72
|
-
let resolvedKey = false;
|
|
73
|
-
if (typeof key === 'function') {
|
|
74
|
-
key = await key(parsedProt, jws);
|
|
75
|
-
resolvedKey = true;
|
|
76
|
-
checkKeyTypeWithJwk(alg, key, 'verify');
|
|
77
|
-
if (isJWK(key)) {
|
|
78
|
-
key = await importJWK(key, alg);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
checkKeyTypeWithJwk(alg, key, 'verify');
|
|
83
|
-
}
|
|
84
|
-
const data = concat(encoder.encode(jws.protected ?? ''), encoder.encode('.'), typeof jws.payload === 'string' ? encoder.encode(jws.payload) : jws.payload);
|
|
85
|
-
let signature;
|
|
86
|
-
try {
|
|
87
|
-
signature = base64url(jws.signature);
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
throw new JWSInvalid('Failed to base64url decode the signature');
|
|
91
|
-
}
|
|
92
|
-
const verified = await verify(alg, key, signature, data);
|
|
93
|
-
if (!verified) {
|
|
94
|
-
throw new JWSSignatureVerificationFailed();
|
|
95
|
-
}
|
|
96
|
-
let payload;
|
|
97
|
-
if (b64) {
|
|
98
|
-
try {
|
|
99
|
-
payload = base64url(jws.payload);
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
throw new JWSInvalid('Failed to base64url decode the payload');
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
else if (typeof jws.payload === 'string') {
|
|
106
|
-
payload = encoder.encode(jws.payload);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
payload = jws.payload;
|
|
110
|
-
}
|
|
111
|
-
const result = { payload };
|
|
112
|
-
if (jws.protected !== undefined) {
|
|
113
|
-
result.protectedHeader = parsedProt;
|
|
114
|
-
}
|
|
115
|
-
if (jws.header !== undefined) {
|
|
116
|
-
result.unprotectedHeader = jws.header;
|
|
117
|
-
}
|
|
118
|
-
if (resolvedKey) {
|
|
119
|
-
return { ...result, key };
|
|
120
|
-
}
|
|
121
|
-
return result;
|
|
122
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { flattenedVerify } from '../flattened/verify.js';
|
|
2
|
-
import { JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';
|
|
3
|
-
import isObject from '../../lib/is_object.js';
|
|
4
|
-
export async function generalVerify(jws, key, options) {
|
|
5
|
-
if (!isObject(jws)) {
|
|
6
|
-
throw new JWSInvalid('General JWS must be an object');
|
|
7
|
-
}
|
|
8
|
-
if (!Array.isArray(jws.signatures) || !jws.signatures.every(isObject)) {
|
|
9
|
-
throw new JWSInvalid('JWS Signatures missing or incorrect type');
|
|
10
|
-
}
|
|
11
|
-
for (const signature of jws.signatures) {
|
|
12
|
-
try {
|
|
13
|
-
return await flattenedVerify({
|
|
14
|
-
header: signature.header,
|
|
15
|
-
payload: jws.payload,
|
|
16
|
-
protected: signature.protected,
|
|
17
|
-
signature: signature.signature,
|
|
18
|
-
}, key, options);
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
throw new JWSSignatureVerificationFailed();
|
|
24
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { compactDecrypt } from '../jwe/compact/decrypt.js';
|
|
2
|
-
import jwtPayload from '../lib/jwt_claims_set.js';
|
|
3
|
-
import { JWTClaimValidationFailed } from '../util/errors.js';
|
|
4
|
-
export async function jwtDecrypt(jwt, key, options) {
|
|
5
|
-
const decrypted = await compactDecrypt(jwt, key, options);
|
|
6
|
-
const payload = jwtPayload(decrypted.protectedHeader, decrypted.plaintext, options);
|
|
7
|
-
const { protectedHeader } = decrypted;
|
|
8
|
-
if (protectedHeader.iss !== undefined && protectedHeader.iss !== payload.iss) {
|
|
9
|
-
throw new JWTClaimValidationFailed('replicated "iss" claim header parameter mismatch', payload, 'iss', 'mismatch');
|
|
10
|
-
}
|
|
11
|
-
if (protectedHeader.sub !== undefined && protectedHeader.sub !== payload.sub) {
|
|
12
|
-
throw new JWTClaimValidationFailed('replicated "sub" claim header parameter mismatch', payload, 'sub', 'mismatch');
|
|
13
|
-
}
|
|
14
|
-
if (protectedHeader.aud !== undefined &&
|
|
15
|
-
JSON.stringify(protectedHeader.aud) !== JSON.stringify(payload.aud)) {
|
|
16
|
-
throw new JWTClaimValidationFailed('replicated "aud" claim header parameter mismatch', payload, 'aud', 'mismatch');
|
|
17
|
-
}
|
|
18
|
-
const result = { payload, protectedHeader };
|
|
19
|
-
if (typeof key === 'function') {
|
|
20
|
-
return { ...result, key: decrypted.key };
|
|
21
|
-
}
|
|
22
|
-
return result;
|
|
23
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import * as base64url from '../runtime/base64url.js';
|
|
2
|
-
import { decoder } from '../lib/buffer_utils.js';
|
|
3
|
-
import { JWTInvalid } from '../util/errors.js';
|
|
4
|
-
import jwtPayload from '../lib/jwt_claims_set.js';
|
|
5
|
-
import { ProduceJWT } from './produce.js';
|
|
6
|
-
export class UnsecuredJWT extends ProduceJWT {
|
|
7
|
-
encode() {
|
|
8
|
-
const header = base64url.encode(JSON.stringify({ alg: 'none' }));
|
|
9
|
-
const payload = base64url.encode(JSON.stringify(this._payload));
|
|
10
|
-
return `${header}.${payload}.`;
|
|
11
|
-
}
|
|
12
|
-
static decode(jwt, options) {
|
|
13
|
-
if (typeof jwt !== 'string') {
|
|
14
|
-
throw new JWTInvalid('Unsecured JWT must be a string');
|
|
15
|
-
}
|
|
16
|
-
const { 0: encodedHeader, 1: encodedPayload, 2: signature, length } = jwt.split('.');
|
|
17
|
-
if (length !== 3 || signature !== '') {
|
|
18
|
-
throw new JWTInvalid('Invalid Unsecured JWT');
|
|
19
|
-
}
|
|
20
|
-
let header;
|
|
21
|
-
try {
|
|
22
|
-
header = JSON.parse(decoder.decode(base64url.decode(encodedHeader)));
|
|
23
|
-
if (header.alg !== 'none')
|
|
24
|
-
throw new Error();
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
throw new JWTInvalid('Invalid Unsecured JWT');
|
|
28
|
-
}
|
|
29
|
-
const payload = jwtPayload(header, base64url.decode(encodedPayload), options);
|
|
30
|
-
return { payload, header };
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { compactVerify } from '../jws/compact/verify.js';
|
|
2
|
-
import jwtPayload from '../lib/jwt_claims_set.js';
|
|
3
|
-
import { JWTInvalid } from '../util/errors.js';
|
|
4
|
-
export async function jwtVerify(jwt, key, options) {
|
|
5
|
-
const verified = await compactVerify(jwt, key, options);
|
|
6
|
-
if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) {
|
|
7
|
-
throw new JWTInvalid('JWTs MUST NOT use unencoded payload');
|
|
8
|
-
}
|
|
9
|
-
const payload = jwtPayload(verified.protectedHeader, verified.payload, options);
|
|
10
|
-
const result = { payload, protectedHeader: verified.protectedHeader };
|
|
11
|
-
if (typeof key === 'function') {
|
|
12
|
-
return { ...result, key: verified.key };
|
|
13
|
-
}
|
|
14
|
-
return result;
|
|
15
|
-
}
|