jose 5.9.6 → 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 +21 -19
- 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 +38 -59
- 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 +4 -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} +5 -54
- package/dist/webapi/key/generate_secret.js +40 -0
- package/dist/{browser → webapi}/key/import.js +9 -7
- 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 +25 -17
- 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 +11 -23
- 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 +4 -10
- 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 +5 -4
- 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 -121
- 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 -152
- 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 -125
- 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 -156
- 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 -25
- 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 -101
- 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 -106
- 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 -22
- 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 -97
- 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 -103
- 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,12 +1,11 @@
|
|
|
1
|
-
import { concat, uint64be } from '
|
|
2
|
-
import checkIvLength from '
|
|
1
|
+
import { concat, uint64be } from './buffer_utils.js';
|
|
2
|
+
import checkIvLength from './check_iv_length.js';
|
|
3
3
|
import checkCekLength from './check_cek_length.js';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import generateIv from '../lib/iv.js';
|
|
4
|
+
import { checkEncCryptoKey } from './crypto_key.js';
|
|
5
|
+
import invalidKeyInput from './invalid_key_input.js';
|
|
6
|
+
import generateIv from './iv.js';
|
|
8
7
|
import { JOSENotSupported } from '../util/errors.js';
|
|
9
|
-
import {
|
|
8
|
+
import { isCryptoKey } from './is_key_like.js';
|
|
10
9
|
async function cbcEncrypt(enc, plaintext, cek, iv, aad) {
|
|
11
10
|
if (!(cek instanceof Uint8Array)) {
|
|
12
11
|
throw new TypeError(invalidKeyInput(cek, 'Uint8Array'));
|
|
@@ -44,9 +43,9 @@ async function gcmEncrypt(enc, plaintext, cek, iv, aad) {
|
|
|
44
43
|
const ciphertext = encrypted.slice(0, -16);
|
|
45
44
|
return { ciphertext, tag, iv };
|
|
46
45
|
}
|
|
47
|
-
|
|
46
|
+
export default async (enc, plaintext, cek, iv, aad) => {
|
|
48
47
|
if (!isCryptoKey(cek) && !(cek instanceof Uint8Array)) {
|
|
49
|
-
throw new TypeError(invalidKeyInput(cek,
|
|
48
|
+
throw new TypeError(invalidKeyInput(cek, 'CryptoKey', 'KeyObject', 'Uint8Array', 'JSON Web Key'));
|
|
50
49
|
}
|
|
51
50
|
if (iv) {
|
|
52
51
|
checkIvLength(enc, iv);
|
|
@@ -73,4 +72,3 @@ const encrypt = async (enc, plaintext, cek, iv, aad) => {
|
|
|
73
72
|
throw new JOSENotSupported('Unsupported JWE Content Encryption Algorithm');
|
|
74
73
|
}
|
|
75
74
|
};
|
|
76
|
-
export default encrypt;
|
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
1
|
+
import * as aeskw from './aeskw.js';
|
|
2
|
+
import * as ecdhes from './ecdhes.js';
|
|
3
|
+
import * as pbes2kw from './pbes2kw.js';
|
|
4
|
+
import * as rsaes from './rsaes.js';
|
|
5
|
+
import * as base64url from '../lib/base64url.js';
|
|
6
|
+
import normalizeKey from './normalize_key.js';
|
|
7
7
|
import generateCek, { bitLength as cekLength } from '../lib/cek.js';
|
|
8
8
|
import { JOSENotSupported } from '../util/errors.js';
|
|
9
9
|
import { exportJWK } from '../key/export.js';
|
|
10
|
-
import checkKeyType from './check_key_type.js';
|
|
11
10
|
import { wrap as aesGcmKw } from './aesgcmkw.js';
|
|
12
|
-
|
|
11
|
+
import { assertCryptoKey } from './is_key_like.js';
|
|
12
|
+
export default async (alg, enc, key, providedCek, providedParameters = {}) => {
|
|
13
13
|
let encryptedKey;
|
|
14
14
|
let parameters;
|
|
15
15
|
let cek;
|
|
16
|
-
checkKeyType(alg, key, 'encrypt');
|
|
17
|
-
key = (await normalize.normalizePublicKey?.(key, alg)) || key;
|
|
18
16
|
switch (alg) {
|
|
19
17
|
case 'dir': {
|
|
20
18
|
cek = key;
|
|
@@ -24,37 +22,43 @@ async function encryptKeyManagement(alg, enc, key, providedCek, providedParamete
|
|
|
24
22
|
case 'ECDH-ES+A128KW':
|
|
25
23
|
case 'ECDH-ES+A192KW':
|
|
26
24
|
case 'ECDH-ES+A256KW': {
|
|
27
|
-
|
|
25
|
+
assertCryptoKey(key);
|
|
26
|
+
if (!ecdhes.allowed(key)) {
|
|
28
27
|
throw new JOSENotSupported('ECDH with the provided key is not allowed or not supported by your javascript runtime');
|
|
29
28
|
}
|
|
30
29
|
const { apu, apv } = providedParameters;
|
|
31
|
-
let
|
|
32
|
-
|
|
30
|
+
let ephemeralKey;
|
|
31
|
+
if (providedParameters.epk) {
|
|
32
|
+
ephemeralKey = (await normalizeKey(providedParameters.epk, alg));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
ephemeralKey = (await crypto.subtle.generateKey(key.algorithm, true, ['deriveBits'])).privateKey;
|
|
36
|
+
}
|
|
33
37
|
const { x, y, crv, kty } = await exportJWK(ephemeralKey);
|
|
34
|
-
const sharedSecret = await
|
|
38
|
+
const sharedSecret = await ecdhes.deriveKey(key, ephemeralKey, alg === 'ECDH-ES' ? enc : alg, alg === 'ECDH-ES' ? cekLength(enc) : parseInt(alg.slice(-5, -2), 10), apu, apv);
|
|
35
39
|
parameters = { epk: { x, crv, kty } };
|
|
36
40
|
if (kty === 'EC')
|
|
37
41
|
parameters.epk.y = y;
|
|
38
42
|
if (apu)
|
|
39
|
-
parameters.apu = base64url(apu);
|
|
43
|
+
parameters.apu = base64url.encode(apu);
|
|
40
44
|
if (apv)
|
|
41
|
-
parameters.apv = base64url(apv);
|
|
45
|
+
parameters.apv = base64url.encode(apv);
|
|
42
46
|
if (alg === 'ECDH-ES') {
|
|
43
47
|
cek = sharedSecret;
|
|
44
48
|
break;
|
|
45
49
|
}
|
|
46
50
|
cek = providedCek || generateCek(enc);
|
|
47
51
|
const kwAlg = alg.slice(-6);
|
|
48
|
-
encryptedKey = await
|
|
52
|
+
encryptedKey = await aeskw.wrap(kwAlg, sharedSecret, cek);
|
|
49
53
|
break;
|
|
50
54
|
}
|
|
51
|
-
case 'RSA1_5':
|
|
52
55
|
case 'RSA-OAEP':
|
|
53
56
|
case 'RSA-OAEP-256':
|
|
54
57
|
case 'RSA-OAEP-384':
|
|
55
58
|
case 'RSA-OAEP-512': {
|
|
56
59
|
cek = providedCek || generateCek(enc);
|
|
57
|
-
|
|
60
|
+
assertCryptoKey(key);
|
|
61
|
+
encryptedKey = await rsaes.encrypt(alg, key, cek);
|
|
58
62
|
break;
|
|
59
63
|
}
|
|
60
64
|
case 'PBES2-HS256+A128KW':
|
|
@@ -62,14 +66,14 @@ async function encryptKeyManagement(alg, enc, key, providedCek, providedParamete
|
|
|
62
66
|
case 'PBES2-HS512+A256KW': {
|
|
63
67
|
cek = providedCek || generateCek(enc);
|
|
64
68
|
const { p2c, p2s } = providedParameters;
|
|
65
|
-
({ encryptedKey, ...parameters } = await
|
|
69
|
+
({ encryptedKey, ...parameters } = await pbes2kw.wrap(alg, key, cek, p2c, p2s));
|
|
66
70
|
break;
|
|
67
71
|
}
|
|
68
72
|
case 'A128KW':
|
|
69
73
|
case 'A192KW':
|
|
70
74
|
case 'A256KW': {
|
|
71
75
|
cek = providedCek || generateCek(enc);
|
|
72
|
-
encryptedKey = await
|
|
76
|
+
encryptedKey = await aeskw.wrap(alg, key, cek);
|
|
73
77
|
break;
|
|
74
78
|
}
|
|
75
79
|
case 'A128GCMKW':
|
|
@@ -85,5 +89,4 @@ async function encryptKeyManagement(alg, enc, key, providedCek, providedParamete
|
|
|
85
89
|
}
|
|
86
90
|
}
|
|
87
91
|
return { cek, encryptedKey, parameters };
|
|
88
|
-
}
|
|
89
|
-
export default encryptKeyManagement;
|
|
92
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { checkSigCryptoKey } from './crypto_key.js';
|
|
2
|
+
import invalidKeyInput from './invalid_key_input.js';
|
|
3
|
+
export default async (alg, key, usage) => {
|
|
4
|
+
if (key instanceof Uint8Array) {
|
|
5
|
+
if (!alg.startsWith('HS')) {
|
|
6
|
+
throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));
|
|
7
|
+
}
|
|
8
|
+
return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]);
|
|
9
|
+
}
|
|
10
|
+
checkSigCryptoKey(key, alg, usage);
|
|
11
|
+
return key;
|
|
12
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
export default (...headers) => {
|
|
2
2
|
const sources = headers.filter(Boolean);
|
|
3
3
|
if (sources.length === 0 || sources.length === 1) {
|
|
4
4
|
return true;
|
|
@@ -19,4 +19,3 @@ const isDisjoint = (...headers) => {
|
|
|
19
19
|
}
|
|
20
20
|
return true;
|
|
21
21
|
};
|
|
22
|
-
export default isDisjoint;
|
|
@@ -9,5 +9,5 @@ export function isPublicJWK(key) {
|
|
|
9
9
|
return key.kty !== 'oct' && typeof key.d === 'undefined';
|
|
10
10
|
}
|
|
11
11
|
export function isSecretJWK(key) {
|
|
12
|
-
return
|
|
12
|
+
return key.kty === 'oct' && typeof key.k === 'string';
|
|
13
13
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function assertCryptoKey(key) {
|
|
2
|
+
if (!isCryptoKey(key)) {
|
|
3
|
+
throw new Error('CryptoKey instance expected');
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
export function isCryptoKey(key) {
|
|
7
|
+
return key?.[Symbol.toStringTag] === 'CryptoKey';
|
|
8
|
+
}
|
|
9
|
+
export function isKeyObject(key) {
|
|
10
|
+
return key?.[Symbol.toStringTag] === 'KeyObject';
|
|
11
|
+
}
|
|
12
|
+
export default (key) => {
|
|
13
|
+
return isCryptoKey(key) || isKeyObject(key);
|
|
14
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
function isObjectLike(value) {
|
|
2
2
|
return typeof value === 'object' && value !== null;
|
|
3
3
|
}
|
|
4
|
-
export default
|
|
4
|
+
export default (input) => {
|
|
5
5
|
if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {
|
|
6
6
|
return false;
|
|
7
7
|
}
|
|
@@ -13,4 +13,4 @@ export default function isObject(input) {
|
|
|
13
13
|
proto = Object.getPrototypeOf(proto);
|
|
14
14
|
}
|
|
15
15
|
return Object.getPrototypeOf(input) === proto;
|
|
16
|
-
}
|
|
16
|
+
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { JOSENotSupported } from '../util/errors.js';
|
|
2
|
-
import random from '../runtime/random.js';
|
|
3
2
|
export function bitLength(alg) {
|
|
4
3
|
switch (alg) {
|
|
5
4
|
case 'A128GCM':
|
|
@@ -17,4 +16,4 @@ export function bitLength(alg) {
|
|
|
17
16
|
throw new JOSENotSupported(`Unsupported JWE Algorithm: ${alg}`);
|
|
18
17
|
}
|
|
19
18
|
}
|
|
20
|
-
export default (alg) =>
|
|
19
|
+
export default (alg) => crypto.getRandomValues(new Uint8Array(bitLength(alg) >> 3));
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import crypto from './webcrypto.js';
|
|
2
1
|
import { JOSENotSupported } from '../util/errors.js';
|
|
3
2
|
function subtleMapping(jwk) {
|
|
4
3
|
let algorithm;
|
|
@@ -61,8 +60,9 @@ function subtleMapping(jwk) {
|
|
|
61
60
|
}
|
|
62
61
|
case 'OKP': {
|
|
63
62
|
switch (jwk.alg) {
|
|
63
|
+
case 'Ed25519':
|
|
64
64
|
case 'EdDSA':
|
|
65
|
-
algorithm = { name:
|
|
65
|
+
algorithm = { name: 'Ed25519' };
|
|
66
66
|
keyUsages = jwk.d ? ['sign'] : ['verify'];
|
|
67
67
|
break;
|
|
68
68
|
case 'ECDH-ES':
|
|
@@ -82,19 +82,13 @@ function subtleMapping(jwk) {
|
|
|
82
82
|
}
|
|
83
83
|
return { algorithm, keyUsages };
|
|
84
84
|
}
|
|
85
|
-
|
|
85
|
+
export default async (jwk) => {
|
|
86
86
|
if (!jwk.alg) {
|
|
87
87
|
throw new TypeError('"alg" argument is required when "jwk.alg" is not present');
|
|
88
88
|
}
|
|
89
89
|
const { algorithm, keyUsages } = subtleMapping(jwk);
|
|
90
|
-
const rest = [
|
|
91
|
-
algorithm,
|
|
92
|
-
jwk.ext ?? false,
|
|
93
|
-
jwk.key_ops ?? keyUsages,
|
|
94
|
-
];
|
|
95
90
|
const keyData = { ...jwk };
|
|
96
91
|
delete keyData.alg;
|
|
97
92
|
delete keyData.use;
|
|
98
|
-
return crypto.subtle.importKey('jwk', keyData,
|
|
93
|
+
return crypto.subtle.importKey('jwk', keyData, algorithm, jwk.ext ?? (jwk.d ? false : true), jwk.key_ops ?? keyUsages);
|
|
99
94
|
};
|
|
100
|
-
export default parse;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import invalidKeyInput from './invalid_key_input.js';
|
|
2
|
+
import { encode as base64url } from './base64url.js';
|
|
3
|
+
import { isCryptoKey, isKeyObject } from './is_key_like.js';
|
|
4
|
+
export default async function keyToJWK(key) {
|
|
5
|
+
if (isKeyObject(key)) {
|
|
6
|
+
if (key.type === 'secret') {
|
|
7
|
+
key = key.export();
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
return key.export({ format: 'jwk' });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
if (key instanceof Uint8Array) {
|
|
14
|
+
return {
|
|
15
|
+
kty: 'oct',
|
|
16
|
+
k: base64url(key),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
if (!isCryptoKey(key)) {
|
|
20
|
+
throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'Uint8Array'));
|
|
21
|
+
}
|
|
22
|
+
if (!key.extractable) {
|
|
23
|
+
throw new TypeError('non-extractable CryptoKey cannot be exported as a JWK');
|
|
24
|
+
}
|
|
25
|
+
const { ext, key_ops, alg, use, ...jwk } = await crypto.subtle.exportKey('jwk', key);
|
|
26
|
+
return jwk;
|
|
27
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { isJWK } from './is_jwk.js';
|
|
2
|
+
import { decode } from './base64url.js';
|
|
3
|
+
import importJWK from './jwk_to_key.js';
|
|
4
|
+
import { isCryptoKey, isKeyObject } from './is_key_like.js';
|
|
5
|
+
let cache;
|
|
6
|
+
const handleJWK = async (key, jwk, alg, freeze = false) => {
|
|
7
|
+
cache ||= new WeakMap();
|
|
8
|
+
let cached = cache.get(key);
|
|
9
|
+
if (cached?.[alg]) {
|
|
10
|
+
return cached[alg];
|
|
11
|
+
}
|
|
12
|
+
const cryptoKey = await importJWK({ ...jwk, alg });
|
|
13
|
+
if (freeze)
|
|
14
|
+
Object.freeze(key);
|
|
15
|
+
if (!cached) {
|
|
16
|
+
cache.set(key, { [alg]: cryptoKey });
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
cached[alg] = cryptoKey;
|
|
20
|
+
}
|
|
21
|
+
return cryptoKey;
|
|
22
|
+
};
|
|
23
|
+
const handleKeyObject = (keyObject, alg) => {
|
|
24
|
+
cache ||= new WeakMap();
|
|
25
|
+
let cached = cache.get(keyObject);
|
|
26
|
+
if (cached?.[alg]) {
|
|
27
|
+
return cached[alg];
|
|
28
|
+
}
|
|
29
|
+
const isPublic = keyObject.type === 'public';
|
|
30
|
+
const extractable = isPublic ? true : false;
|
|
31
|
+
let cryptoKey;
|
|
32
|
+
if (keyObject.asymmetricKeyType === 'x25519') {
|
|
33
|
+
switch (alg) {
|
|
34
|
+
case 'ECDH-ES':
|
|
35
|
+
case 'ECDH-ES+A128KW':
|
|
36
|
+
case 'ECDH-ES+A192KW':
|
|
37
|
+
case 'ECDH-ES+A256KW':
|
|
38
|
+
break;
|
|
39
|
+
default:
|
|
40
|
+
throw new TypeError('given KeyObject instance cannot be used for this algorithm');
|
|
41
|
+
}
|
|
42
|
+
cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, isPublic ? [] : ['deriveBits']);
|
|
43
|
+
}
|
|
44
|
+
if (keyObject.asymmetricKeyType === 'ed25519') {
|
|
45
|
+
if (alg !== 'EdDSA' && alg !== 'Ed25519') {
|
|
46
|
+
throw new TypeError('given KeyObject instance cannot be used for this algorithm');
|
|
47
|
+
}
|
|
48
|
+
cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [
|
|
49
|
+
isPublic ? 'verify' : 'sign',
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
if (keyObject.asymmetricKeyType === 'rsa') {
|
|
53
|
+
let hash;
|
|
54
|
+
switch (alg) {
|
|
55
|
+
case 'RSA-OAEP':
|
|
56
|
+
hash = 'SHA-1';
|
|
57
|
+
break;
|
|
58
|
+
case 'RS256':
|
|
59
|
+
case 'PS256':
|
|
60
|
+
case 'RSA-OAEP-256':
|
|
61
|
+
hash = 'SHA-256';
|
|
62
|
+
break;
|
|
63
|
+
case 'RS384':
|
|
64
|
+
case 'PS384':
|
|
65
|
+
case 'RSA-OAEP-384':
|
|
66
|
+
hash = 'SHA-384';
|
|
67
|
+
break;
|
|
68
|
+
case 'RS512':
|
|
69
|
+
case 'PS512':
|
|
70
|
+
case 'RSA-OAEP-512':
|
|
71
|
+
hash = 'SHA-512';
|
|
72
|
+
break;
|
|
73
|
+
default:
|
|
74
|
+
throw new TypeError('given KeyObject instance cannot be used for this algorithm');
|
|
75
|
+
}
|
|
76
|
+
if (alg.startsWith('RSA-OAEP')) {
|
|
77
|
+
return keyObject.toCryptoKey({
|
|
78
|
+
name: 'RSA-OAEP',
|
|
79
|
+
hash,
|
|
80
|
+
}, extractable, isPublic ? ['encrypt'] : ['decrypt']);
|
|
81
|
+
}
|
|
82
|
+
cryptoKey = keyObject.toCryptoKey({
|
|
83
|
+
name: alg.startsWith('PS') ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5',
|
|
84
|
+
hash,
|
|
85
|
+
}, extractable, [isPublic ? 'verify' : 'sign']);
|
|
86
|
+
}
|
|
87
|
+
if (keyObject.asymmetricKeyType === 'ec') {
|
|
88
|
+
const nist = new Map([
|
|
89
|
+
['prime256v1', 'P-256'],
|
|
90
|
+
['secp384r1', 'P-384'],
|
|
91
|
+
['secp521r1', 'P-521'],
|
|
92
|
+
]);
|
|
93
|
+
const namedCurve = nist.get(keyObject.asymmetricKeyDetails?.namedCurve);
|
|
94
|
+
if (!namedCurve) {
|
|
95
|
+
throw new TypeError('given KeyObject instance cannot be used for this algorithm');
|
|
96
|
+
}
|
|
97
|
+
if (alg === 'ES256' && namedCurve === 'P-256') {
|
|
98
|
+
cryptoKey = keyObject.toCryptoKey({
|
|
99
|
+
name: 'ECDSA',
|
|
100
|
+
namedCurve,
|
|
101
|
+
}, extractable, [isPublic ? 'verify' : 'sign']);
|
|
102
|
+
}
|
|
103
|
+
if (alg === 'ES384' && namedCurve === 'P-384') {
|
|
104
|
+
cryptoKey = keyObject.toCryptoKey({
|
|
105
|
+
name: 'ECDSA',
|
|
106
|
+
namedCurve,
|
|
107
|
+
}, extractable, [isPublic ? 'verify' : 'sign']);
|
|
108
|
+
}
|
|
109
|
+
if (alg === 'ES512' && namedCurve === 'P-521') {
|
|
110
|
+
cryptoKey = keyObject.toCryptoKey({
|
|
111
|
+
name: 'ECDSA',
|
|
112
|
+
namedCurve,
|
|
113
|
+
}, extractable, [isPublic ? 'verify' : 'sign']);
|
|
114
|
+
}
|
|
115
|
+
if (alg.startsWith('ECDH-ES')) {
|
|
116
|
+
cryptoKey = keyObject.toCryptoKey({
|
|
117
|
+
name: 'ECDH',
|
|
118
|
+
namedCurve,
|
|
119
|
+
}, extractable, isPublic ? [] : ['deriveBits']);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (!cryptoKey) {
|
|
123
|
+
throw new TypeError('given KeyObject instance cannot be used for this algorithm');
|
|
124
|
+
}
|
|
125
|
+
if (!cached) {
|
|
126
|
+
cache.set(keyObject, { [alg]: cryptoKey });
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
cached[alg] = cryptoKey;
|
|
130
|
+
}
|
|
131
|
+
return cryptoKey;
|
|
132
|
+
};
|
|
133
|
+
export default async (key, alg) => {
|
|
134
|
+
if (key instanceof Uint8Array) {
|
|
135
|
+
return key;
|
|
136
|
+
}
|
|
137
|
+
if (isCryptoKey(key)) {
|
|
138
|
+
return key;
|
|
139
|
+
}
|
|
140
|
+
if (isKeyObject(key)) {
|
|
141
|
+
if (key.type === 'secret') {
|
|
142
|
+
return key.export();
|
|
143
|
+
}
|
|
144
|
+
if ('toCryptoKey' in key && typeof key.toCryptoKey === 'function') {
|
|
145
|
+
try {
|
|
146
|
+
return handleKeyObject(key, alg);
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
if (err instanceof TypeError) {
|
|
150
|
+
throw err;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
let jwk = key.export({ format: 'jwk' });
|
|
155
|
+
return handleJWK(key, jwk, alg);
|
|
156
|
+
}
|
|
157
|
+
if (isJWK(key)) {
|
|
158
|
+
if (key.k) {
|
|
159
|
+
return decode(key.k);
|
|
160
|
+
}
|
|
161
|
+
return handleJWK(key, key, alg, true);
|
|
162
|
+
}
|
|
163
|
+
throw new Error('unreachable');
|
|
164
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { encode as base64url } from './base64url.js';
|
|
2
|
+
import * as aeskw from './aeskw.js';
|
|
3
|
+
import { checkEncCryptoKey } from './crypto_key.js';
|
|
4
|
+
import { concat, encoder } from './buffer_utils.js';
|
|
5
|
+
import { JWEInvalid } from '../util/errors.js';
|
|
6
|
+
function getCryptoKey(key, alg) {
|
|
7
|
+
if (key instanceof Uint8Array) {
|
|
8
|
+
return crypto.subtle.importKey('raw', key, 'PBKDF2', false, ['deriveBits']);
|
|
9
|
+
}
|
|
10
|
+
checkEncCryptoKey(key, alg, 'deriveBits');
|
|
11
|
+
return key;
|
|
12
|
+
}
|
|
13
|
+
const concatSalt = (alg, p2sInput) => concat(encoder.encode(alg), new Uint8Array([0]), p2sInput);
|
|
14
|
+
async function deriveKey(p2s, alg, p2c, key) {
|
|
15
|
+
if (!(p2s instanceof Uint8Array) || p2s.length < 8) {
|
|
16
|
+
throw new JWEInvalid('PBES2 Salt Input must be 8 or more octets');
|
|
17
|
+
}
|
|
18
|
+
const salt = concatSalt(alg, p2s);
|
|
19
|
+
const keylen = parseInt(alg.slice(13, 16), 10);
|
|
20
|
+
const subtleAlg = {
|
|
21
|
+
hash: `SHA-${alg.slice(8, 11)}`,
|
|
22
|
+
iterations: p2c,
|
|
23
|
+
name: 'PBKDF2',
|
|
24
|
+
salt,
|
|
25
|
+
};
|
|
26
|
+
const cryptoKey = await getCryptoKey(key, alg);
|
|
27
|
+
return new Uint8Array(await crypto.subtle.deriveBits(subtleAlg, cryptoKey, keylen));
|
|
28
|
+
}
|
|
29
|
+
export async function wrap(alg, key, cek, p2c = 2048, p2s = crypto.getRandomValues(new Uint8Array(16))) {
|
|
30
|
+
const derived = await deriveKey(p2s, alg, p2c, key);
|
|
31
|
+
const encryptedKey = await aeskw.wrap(alg.slice(-6), derived, cek);
|
|
32
|
+
return { encryptedKey, p2c, p2s: base64url(p2s) };
|
|
33
|
+
}
|
|
34
|
+
export async function unwrap(alg, key, encryptedKey, p2c, p2s) {
|
|
35
|
+
const derived = await deriveKey(p2s, alg, p2c, key);
|
|
36
|
+
return aeskw.unwrap(alg.slice(-6), derived, encryptedKey);
|
|
37
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { checkEncCryptoKey } from './crypto_key.js';
|
|
2
|
+
import checkKeyLength from './check_key_length.js';
|
|
3
|
+
import { JOSENotSupported } from '../util/errors.js';
|
|
4
|
+
const subtleAlgorithm = (alg) => {
|
|
5
|
+
switch (alg) {
|
|
6
|
+
case 'RSA-OAEP':
|
|
7
|
+
case 'RSA-OAEP-256':
|
|
8
|
+
case 'RSA-OAEP-384':
|
|
9
|
+
case 'RSA-OAEP-512':
|
|
10
|
+
return 'RSA-OAEP';
|
|
11
|
+
default:
|
|
12
|
+
throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export async function encrypt(alg, key, cek) {
|
|
16
|
+
checkEncCryptoKey(key, alg, 'encrypt');
|
|
17
|
+
checkKeyLength(alg, key);
|
|
18
|
+
return new Uint8Array(await crypto.subtle.encrypt(subtleAlgorithm(alg), key, cek));
|
|
19
|
+
}
|
|
20
|
+
export async function decrypt(alg, key, encryptedKey) {
|
|
21
|
+
checkEncCryptoKey(key, alg, 'decrypt');
|
|
22
|
+
checkKeyLength(alg, key);
|
|
23
|
+
return new Uint8Array(await crypto.subtle.decrypt(subtleAlgorithm(alg), key, encryptedKey));
|
|
24
|
+
}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import subtleAlgorithm from './subtle_dsa.js';
|
|
2
|
-
import crypto from './webcrypto.js';
|
|
3
2
|
import checkKeyLength from './check_key_length.js';
|
|
4
3
|
import getSignKey from './get_sign_verify_key.js';
|
|
5
|
-
|
|
4
|
+
export default async (alg, key, data) => {
|
|
6
5
|
const cryptoKey = await getSignKey(alg, key, 'sign');
|
|
7
6
|
checkKeyLength(alg, cryptoKey);
|
|
8
7
|
const signature = await crypto.subtle.sign(subtleAlgorithm(alg, cryptoKey.algorithm), cryptoKey, data);
|
|
9
8
|
return new Uint8Array(signature);
|
|
10
9
|
};
|
|
11
|
-
export default sign;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { JOSENotSupported } from '../util/errors.js';
|
|
2
|
-
export default
|
|
2
|
+
export default (alg, algorithm) => {
|
|
3
3
|
const hash = `SHA-${alg.slice(-3)}`;
|
|
4
4
|
switch (alg) {
|
|
5
5
|
case 'HS256':
|
|
@@ -9,7 +9,7 @@ export default function subtleDsa(alg, algorithm) {
|
|
|
9
9
|
case 'PS256':
|
|
10
10
|
case 'PS384':
|
|
11
11
|
case 'PS512':
|
|
12
|
-
return { hash, name: 'RSA-PSS', saltLength: alg.slice(-3) >> 3 };
|
|
12
|
+
return { hash, name: 'RSA-PSS', saltLength: parseInt(alg.slice(-3), 10) >> 3 };
|
|
13
13
|
case 'RS256':
|
|
14
14
|
case 'RS384':
|
|
15
15
|
case 'RS512':
|
|
@@ -18,9 +18,10 @@ export default function subtleDsa(alg, algorithm) {
|
|
|
18
18
|
case 'ES384':
|
|
19
19
|
case 'ES512':
|
|
20
20
|
return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve };
|
|
21
|
+
case 'Ed25519':
|
|
21
22
|
case 'EdDSA':
|
|
22
|
-
return { name:
|
|
23
|
+
return { name: 'Ed25519' };
|
|
23
24
|
default:
|
|
24
25
|
throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);
|
|
25
26
|
}
|
|
26
|
-
}
|
|
27
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
export default (option, algorithms) => {
|
|
2
2
|
if (algorithms !== undefined &&
|
|
3
3
|
(!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {
|
|
4
4
|
throw new TypeError(`"${option}" option must be an array of strings`);
|
|
@@ -8,4 +8,3 @@ const validateAlgorithms = (option, algorithms) => {
|
|
|
8
8
|
}
|
|
9
9
|
return new Set(algorithms);
|
|
10
10
|
};
|
|
11
|
-
export default validateAlgorithms;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { JOSENotSupported } from '../util/errors.js';
|
|
2
|
-
|
|
1
|
+
import { JOSENotSupported, JWEInvalid, JWSInvalid } from '../util/errors.js';
|
|
2
|
+
export default (Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) => {
|
|
3
3
|
if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {
|
|
4
4
|
throw new Err('"crit" (Critical) Header Parameter MUST be integrity protected');
|
|
5
5
|
}
|
|
@@ -30,5 +30,4 @@ function validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader,
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
return new Set(protectedHeader.crit);
|
|
33
|
-
}
|
|
34
|
-
export default validateCrit;
|
|
33
|
+
};
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import subtleAlgorithm from './subtle_dsa.js';
|
|
2
|
-
import crypto from './webcrypto.js';
|
|
3
2
|
import checkKeyLength from './check_key_length.js';
|
|
4
3
|
import getVerifyKey from './get_sign_verify_key.js';
|
|
5
|
-
|
|
4
|
+
export default async (alg, key, signature, data) => {
|
|
6
5
|
const cryptoKey = await getVerifyKey(alg, key, 'verify');
|
|
7
6
|
checkKeyLength(alg, cryptoKey);
|
|
8
7
|
const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm);
|
|
@@ -13,4 +12,3 @@ const verify = async (alg, key, signature, data) => {
|
|
|
13
12
|
return false;
|
|
14
13
|
}
|
|
15
14
|
};
|
|
16
|
-
export default verify;
|