jose 3.20.3 → 3.20.4
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/dist/browser/jwe/flattened/decrypt.js +2 -2
- package/dist/browser/lib/decrypt_key_management.js +4 -1
- package/dist/node/cjs/jwe/compact/decrypt.js +1 -1
- package/dist/node/cjs/jwe/flattened/decrypt.js +17 -17
- package/dist/node/cjs/jwe/flattened/encrypt.js +13 -13
- package/dist/node/cjs/jwe/general/decrypt.js +2 -2
- package/dist/node/cjs/jwk/embedded.js +2 -2
- package/dist/node/cjs/jwk/from_key_like.js +1 -1
- package/dist/node/cjs/jwk/parse.js +1 -1
- package/dist/node/cjs/jwk/thumbprint.js +2 -2
- package/dist/node/cjs/jwks/remote.js +3 -3
- package/dist/node/cjs/jws/compact/verify.js +1 -1
- package/dist/node/cjs/jws/flattened/sign.js +8 -8
- package/dist/node/cjs/jws/flattened/verify.js +11 -11
- package/dist/node/cjs/jws/general/verify.js +2 -2
- package/dist/node/cjs/jwt/decrypt.js +2 -2
- package/dist/node/cjs/jwt/produce.js +4 -4
- package/dist/node/cjs/jwt/unsecured.js +1 -1
- package/dist/node/cjs/jwt/verify.js +2 -2
- package/dist/node/cjs/key/export.js +3 -3
- package/dist/node/cjs/key/import.js +10 -10
- package/dist/node/cjs/lib/cek.js +1 -1
- package/dist/node/cjs/lib/check_key_type.js +4 -4
- package/dist/node/cjs/lib/decrypt_key_management.js +16 -13
- package/dist/node/cjs/lib/encrypt_key_management.js +14 -14
- package/dist/node/cjs/lib/iv.js +1 -1
- package/dist/node/cjs/lib/jwt_claims_set.js +4 -4
- package/dist/node/cjs/runtime/aesgcmkw.js +4 -4
- package/dist/node/cjs/runtime/aeskw.js +11 -11
- package/dist/node/cjs/runtime/asn1.js +6 -6
- package/dist/node/cjs/runtime/cbc_tag.js +2 -2
- package/dist/node/cjs/runtime/check_cek_length.js +1 -1
- package/dist/node/cjs/runtime/ciphers.js +1 -1
- package/dist/node/cjs/runtime/decrypt.js +15 -15
- package/dist/node/cjs/runtime/digest.js +1 -1
- package/dist/node/cjs/runtime/ecdhes.js +18 -18
- package/dist/node/cjs/runtime/encrypt.js +14 -14
- package/dist/node/cjs/runtime/fetch_jwks.js +2 -2
- package/dist/node/cjs/runtime/generate.js +4 -4
- package/dist/node/cjs/runtime/get_named_curve.js +5 -5
- package/dist/node/cjs/runtime/get_sign_verify_key.js +5 -5
- package/dist/node/cjs/runtime/invalid_key_input.js +2 -2
- package/dist/node/cjs/runtime/is_key_like.js +1 -1
- package/dist/node/cjs/runtime/jwk_to_key.js +11 -11
- package/dist/node/cjs/runtime/key_to_jwk.js +27 -27
- package/dist/node/cjs/runtime/node_key.js +4 -4
- package/dist/node/cjs/runtime/pbes2kw.js +13 -13
- package/dist/node/cjs/runtime/rsaes.js +7 -7
- package/dist/node/cjs/runtime/secret_key.js +1 -1
- package/dist/node/cjs/runtime/sign.js +4 -4
- package/dist/node/cjs/runtime/verify.js +5 -5
- package/dist/node/cjs/runtime/zlib.js +2 -2
- package/dist/node/cjs/util/decode_protected_header.js +2 -2
- package/dist/node/cjs/util/generate_key_pair.js +1 -1
- package/dist/node/cjs/util/generate_secret.js +1 -1
- package/dist/node/esm/jwe/flattened/decrypt.js +2 -2
- package/dist/node/esm/lib/decrypt_key_management.js +4 -1
- package/dist/types/types.d.ts +1 -0
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ const util_1 = require("util");
|
|
|
6
6
|
const random_js_1 = require("./random.js");
|
|
7
7
|
const check_modulus_length_js_1 = require("./check_modulus_length.js");
|
|
8
8
|
const errors_js_1 = require("../util/errors.js");
|
|
9
|
-
const generate =
|
|
9
|
+
const generate = util_1.promisify(crypto_1.generateKeyPair);
|
|
10
10
|
async function generateSecret(alg, options) {
|
|
11
11
|
let length;
|
|
12
12
|
switch (alg) {
|
|
@@ -32,7 +32,7 @@ async function generateSecret(alg, options) {
|
|
|
32
32
|
default:
|
|
33
33
|
throw new errors_js_1.JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');
|
|
34
34
|
}
|
|
35
|
-
return
|
|
35
|
+
return crypto_1.createSecretKey(random_js_1.default(new Uint8Array(length >> 3)));
|
|
36
36
|
}
|
|
37
37
|
exports.generateSecret = generateSecret;
|
|
38
38
|
async function generateKeyPair(alg, options) {
|
|
@@ -57,8 +57,8 @@ async function generateKeyPair(alg, options) {
|
|
|
57
57
|
modulusLength,
|
|
58
58
|
publicExponent: 0x10001,
|
|
59
59
|
});
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
check_modulus_length_js_1.setModulusLength(keypair.privateKey, modulusLength);
|
|
61
|
+
check_modulus_length_js_1.setModulusLength(keypair.publicKey, modulusLength);
|
|
62
62
|
return keypair;
|
|
63
63
|
}
|
|
64
64
|
case 'ES256':
|
|
@@ -28,14 +28,14 @@ const namedCurveToJOSE = (namedCurve) => {
|
|
|
28
28
|
const getNamedCurve = (kee, raw) => {
|
|
29
29
|
var _a;
|
|
30
30
|
let key;
|
|
31
|
-
if (
|
|
32
|
-
key =
|
|
31
|
+
if (webcrypto_js_1.isCryptoKey(kee)) {
|
|
32
|
+
key = webcrypto_js_1.getKeyObject(kee);
|
|
33
33
|
}
|
|
34
|
-
else if (
|
|
34
|
+
else if (is_key_object_js_1.default(kee)) {
|
|
35
35
|
key = kee;
|
|
36
36
|
}
|
|
37
37
|
else {
|
|
38
|
-
throw new TypeError(
|
|
38
|
+
throw new TypeError(invalid_key_input_js_1.default(kee, 'KeyObject', 'CryptoKey'));
|
|
39
39
|
}
|
|
40
40
|
if (key.type === 'secret') {
|
|
41
41
|
throw new TypeError('only "private" or "public" type keys can be used for this operation');
|
|
@@ -53,7 +53,7 @@ const getNamedCurve = (kee, raw) => {
|
|
|
53
53
|
}
|
|
54
54
|
let namedCurve = (_a = key.asymmetricKeyDetails) === null || _a === void 0 ? void 0 : _a.namedCurve;
|
|
55
55
|
if (!namedCurve && key.type === 'private') {
|
|
56
|
-
namedCurve = getNamedCurve(
|
|
56
|
+
namedCurve = getNamedCurve(crypto_1.createPublicKey(key), true);
|
|
57
57
|
}
|
|
58
58
|
else if (!namedCurve) {
|
|
59
59
|
const buf = key.export({ format: 'der', type: 'spki' });
|
|
@@ -7,16 +7,16 @@ const invalid_key_input_js_1 = require("./invalid_key_input.js");
|
|
|
7
7
|
function getSignVerifyKey(alg, key, usage) {
|
|
8
8
|
if (key instanceof Uint8Array) {
|
|
9
9
|
if (!alg.startsWith('HS')) {
|
|
10
|
-
throw new TypeError(
|
|
10
|
+
throw new TypeError(invalid_key_input_js_1.default(key, 'KeyObject', 'CryptoKey'));
|
|
11
11
|
}
|
|
12
|
-
return
|
|
12
|
+
return secret_key_js_1.default(key);
|
|
13
13
|
}
|
|
14
14
|
if (key instanceof crypto.KeyObject) {
|
|
15
15
|
return key;
|
|
16
16
|
}
|
|
17
|
-
if (
|
|
18
|
-
return
|
|
17
|
+
if (webcrypto_js_1.isCryptoKey(key)) {
|
|
18
|
+
return webcrypto_js_1.getKeyObject(key, alg, new Set([usage]));
|
|
19
19
|
}
|
|
20
|
-
throw new TypeError(
|
|
20
|
+
throw new TypeError(invalid_key_input_js_1.default(key, 'KeyObject', 'CryptoKey', 'Uint8Array'));
|
|
21
21
|
}
|
|
22
22
|
exports.default = getSignVerifyKey;
|
|
@@ -24,12 +24,12 @@ exports.default = (actual, ...types) => {
|
|
|
24
24
|
msg += ` Received an instance of ${actual.constructor.name}`;
|
|
25
25
|
}
|
|
26
26
|
else {
|
|
27
|
-
const inspected =
|
|
27
|
+
const inspected = util_1.inspect(actual, { depth: -1 });
|
|
28
28
|
msg += ` Received ${inspected}`;
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
|
-
let inspected =
|
|
32
|
+
let inspected = util_1.inspect(actual, { colors: false });
|
|
33
33
|
if (inspected.length > 25)
|
|
34
34
|
inspected = `${inspected.slice(0, 25)}...`;
|
|
35
35
|
msg += ` Received type ${typeof actual} (${inspected})`;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.types = void 0;
|
|
4
4
|
const webcrypto_js_1 = require("./webcrypto.js");
|
|
5
5
|
const is_key_object_js_1 = require("./is_key_object.js");
|
|
6
|
-
exports.default = (key) =>
|
|
6
|
+
exports.default = (key) => is_key_object_js_1.default(key) || webcrypto_js_1.isCryptoKey(key);
|
|
7
7
|
const types = ['KeyObject'];
|
|
8
8
|
exports.types = types;
|
|
9
9
|
if (parseInt(process.versions.node) >= 16) {
|
|
@@ -14,12 +14,12 @@ const jwkImportSupported = major >= 16 || (major === 15 && minor >= 12);
|
|
|
14
14
|
const parse = (jwk) => {
|
|
15
15
|
if (jwkImportSupported && jwk.kty !== 'oct') {
|
|
16
16
|
return jwk.d
|
|
17
|
-
?
|
|
18
|
-
:
|
|
17
|
+
? crypto_1.createPrivateKey({ format: 'jwk', key: jwk })
|
|
18
|
+
: crypto_1.createPublicKey({ format: 'jwk', key: jwk });
|
|
19
19
|
}
|
|
20
20
|
switch (jwk.kty) {
|
|
21
21
|
case 'oct': {
|
|
22
|
-
return
|
|
22
|
+
return crypto_1.createSecretKey(base64url_js_1.decode(jwk.k));
|
|
23
23
|
}
|
|
24
24
|
case 'RSA': {
|
|
25
25
|
const enc = new asn1_sequence_encoder_js_1.default();
|
|
@@ -47,8 +47,8 @@ const parse = (jwk) => {
|
|
|
47
47
|
format: 'der',
|
|
48
48
|
type: 'pkcs1',
|
|
49
49
|
};
|
|
50
|
-
const keyObject = isPrivate ?
|
|
51
|
-
|
|
50
|
+
const keyObject = isPrivate ? crypto_1.createPrivateKey(createInput) : crypto_1.createPublicKey(createInput);
|
|
51
|
+
check_modulus_length_js_1.setModulusLength(keyObject, modulus.length << 3);
|
|
52
52
|
return keyObject;
|
|
53
53
|
}
|
|
54
54
|
case 'EC': {
|
|
@@ -78,8 +78,8 @@ const parse = (jwk) => {
|
|
|
78
78
|
const f3 = enc$4.end(Buffer.from([0x04]));
|
|
79
79
|
enc.add(f3);
|
|
80
80
|
const der = enc.end();
|
|
81
|
-
const keyObject =
|
|
82
|
-
|
|
81
|
+
const keyObject = crypto_1.createPrivateKey({ key: der, format: 'der', type: 'pkcs8' });
|
|
82
|
+
get_named_curve_js_1.setCurve(keyObject, jwk.crv);
|
|
83
83
|
return keyObject;
|
|
84
84
|
}
|
|
85
85
|
const enc$1 = new asn1_sequence_encoder_js_1.default();
|
|
@@ -88,8 +88,8 @@ const parse = (jwk) => {
|
|
|
88
88
|
enc.add(enc$1.end());
|
|
89
89
|
enc.bitStr(pub);
|
|
90
90
|
const der = enc.end();
|
|
91
|
-
const keyObject =
|
|
92
|
-
|
|
91
|
+
const keyObject = crypto_1.createPublicKey({ key: der, format: 'der', type: 'spki' });
|
|
92
|
+
get_named_curve_js_1.setCurve(keyObject, jwk.crv);
|
|
93
93
|
return keyObject;
|
|
94
94
|
}
|
|
95
95
|
case 'OKP': {
|
|
@@ -105,14 +105,14 @@ const parse = (jwk) => {
|
|
|
105
105
|
const f = enc$2.end(Buffer.from([0x04]));
|
|
106
106
|
enc.add(f);
|
|
107
107
|
const der = enc.end();
|
|
108
|
-
return
|
|
108
|
+
return crypto_1.createPrivateKey({ key: der, format: 'der', type: 'pkcs8' });
|
|
109
109
|
}
|
|
110
110
|
const enc$1 = new asn1_sequence_encoder_js_1.default();
|
|
111
111
|
enc$1.oidFor(jwk.crv);
|
|
112
112
|
enc.add(enc$1.end());
|
|
113
113
|
enc.bitStr(Buffer.from(jwk.x, 'base64'));
|
|
114
114
|
const der = enc.end();
|
|
115
|
-
return
|
|
115
|
+
return crypto_1.createPublicKey({ key: der, format: 'der', type: 'spki' });
|
|
116
116
|
}
|
|
117
117
|
default:
|
|
118
118
|
throw new errors_js_1.JOSENotSupported('Invalid or unsupported JWK "kty" (Key Type) Parameter value');
|
|
@@ -15,23 +15,23 @@ const [major, minor] = process.version
|
|
|
15
15
|
const jwkExportSupported = major >= 16 || (major === 15 && minor >= 9);
|
|
16
16
|
const keyToJWK = (key) => {
|
|
17
17
|
let keyObject;
|
|
18
|
-
if (
|
|
18
|
+
if (webcrypto_js_1.isCryptoKey(key)) {
|
|
19
19
|
if (!key.extractable) {
|
|
20
20
|
throw new TypeError('CryptoKey is not extractable');
|
|
21
21
|
}
|
|
22
|
-
keyObject =
|
|
22
|
+
keyObject = webcrypto_js_1.getKeyObject(key);
|
|
23
23
|
}
|
|
24
|
-
else if (
|
|
24
|
+
else if (is_key_object_js_1.default(key)) {
|
|
25
25
|
keyObject = key;
|
|
26
26
|
}
|
|
27
27
|
else if (key instanceof Uint8Array) {
|
|
28
28
|
return {
|
|
29
29
|
kty: 'oct',
|
|
30
|
-
k:
|
|
30
|
+
k: base64url_js_1.encode(key),
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
33
|
else {
|
|
34
|
-
throw new TypeError(
|
|
34
|
+
throw new TypeError(invalid_key_input_js_1.default(key, 'KeyObject', 'CryptoKey', 'Uint8Array'));
|
|
35
35
|
}
|
|
36
36
|
if (jwkExportSupported) {
|
|
37
37
|
return keyObject.export({ format: 'jwk' });
|
|
@@ -40,7 +40,7 @@ const keyToJWK = (key) => {
|
|
|
40
40
|
case 'secret':
|
|
41
41
|
return {
|
|
42
42
|
kty: 'oct',
|
|
43
|
-
k:
|
|
43
|
+
k: base64url_js_1.encode(keyObject.export()),
|
|
44
44
|
};
|
|
45
45
|
case 'private':
|
|
46
46
|
case 'public': {
|
|
@@ -51,24 +51,24 @@ const keyToJWK = (key) => {
|
|
|
51
51
|
if (keyObject.type === 'private') {
|
|
52
52
|
dec.unsignedInteger();
|
|
53
53
|
}
|
|
54
|
-
const n =
|
|
55
|
-
const e =
|
|
54
|
+
const n = base64url_js_1.encode(dec.unsignedInteger());
|
|
55
|
+
const e = base64url_js_1.encode(dec.unsignedInteger());
|
|
56
56
|
let jwk;
|
|
57
57
|
if (keyObject.type === 'private') {
|
|
58
58
|
jwk = {
|
|
59
|
-
d:
|
|
60
|
-
p:
|
|
61
|
-
q:
|
|
62
|
-
dp:
|
|
63
|
-
dq:
|
|
64
|
-
qi:
|
|
59
|
+
d: base64url_js_1.encode(dec.unsignedInteger()),
|
|
60
|
+
p: base64url_js_1.encode(dec.unsignedInteger()),
|
|
61
|
+
q: base64url_js_1.encode(dec.unsignedInteger()),
|
|
62
|
+
dp: base64url_js_1.encode(dec.unsignedInteger()),
|
|
63
|
+
dq: base64url_js_1.encode(dec.unsignedInteger()),
|
|
64
|
+
qi: base64url_js_1.encode(dec.unsignedInteger()),
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
dec.end();
|
|
68
68
|
return { kty: 'RSA', n, e, ...jwk };
|
|
69
69
|
}
|
|
70
70
|
case 'ec': {
|
|
71
|
-
const crv =
|
|
71
|
+
const crv = get_named_curve_js_1.default(keyObject);
|
|
72
72
|
let len;
|
|
73
73
|
let offset;
|
|
74
74
|
let correction;
|
|
@@ -101,8 +101,8 @@ const keyToJWK = (key) => {
|
|
|
101
101
|
return {
|
|
102
102
|
kty: 'EC',
|
|
103
103
|
crv,
|
|
104
|
-
x:
|
|
105
|
-
y:
|
|
104
|
+
x: base64url_js_1.encode(der.subarray(-len, -len / 2)),
|
|
105
|
+
y: base64url_js_1.encode(der.subarray(-len / 2)),
|
|
106
106
|
};
|
|
107
107
|
}
|
|
108
108
|
const der = keyObject.export({ type: 'pkcs8', format: 'der' });
|
|
@@ -110,42 +110,42 @@ const keyToJWK = (key) => {
|
|
|
110
110
|
offset += correction;
|
|
111
111
|
}
|
|
112
112
|
return {
|
|
113
|
-
...keyToJWK(
|
|
114
|
-
d:
|
|
113
|
+
...keyToJWK(crypto_1.createPublicKey(keyObject)),
|
|
114
|
+
d: base64url_js_1.encode(der.subarray(offset, offset + len / 2)),
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
117
|
case 'ed25519':
|
|
118
118
|
case 'x25519': {
|
|
119
|
-
const crv =
|
|
119
|
+
const crv = get_named_curve_js_1.default(keyObject);
|
|
120
120
|
if (keyObject.type === 'public') {
|
|
121
121
|
const der = keyObject.export({ type: 'spki', format: 'der' });
|
|
122
122
|
return {
|
|
123
123
|
kty: 'OKP',
|
|
124
124
|
crv,
|
|
125
|
-
x:
|
|
125
|
+
x: base64url_js_1.encode(der.subarray(-32)),
|
|
126
126
|
};
|
|
127
127
|
}
|
|
128
128
|
const der = keyObject.export({ type: 'pkcs8', format: 'der' });
|
|
129
129
|
return {
|
|
130
|
-
...keyToJWK(
|
|
131
|
-
d:
|
|
130
|
+
...keyToJWK(crypto_1.createPublicKey(keyObject)),
|
|
131
|
+
d: base64url_js_1.encode(der.subarray(-32)),
|
|
132
132
|
};
|
|
133
133
|
}
|
|
134
134
|
case 'ed448':
|
|
135
135
|
case 'x448': {
|
|
136
|
-
const crv =
|
|
136
|
+
const crv = get_named_curve_js_1.default(keyObject);
|
|
137
137
|
if (keyObject.type === 'public') {
|
|
138
138
|
const der = keyObject.export({ type: 'spki', format: 'der' });
|
|
139
139
|
return {
|
|
140
140
|
kty: 'OKP',
|
|
141
141
|
crv,
|
|
142
|
-
x:
|
|
142
|
+
x: base64url_js_1.encode(der.subarray(crv === 'Ed448' ? -57 : -56)),
|
|
143
143
|
};
|
|
144
144
|
}
|
|
145
145
|
const der = keyObject.export({ type: 'pkcs8', format: 'der' });
|
|
146
146
|
return {
|
|
147
|
-
...keyToJWK(
|
|
148
|
-
d:
|
|
147
|
+
...keyToJWK(crypto_1.createPublicKey(keyObject)),
|
|
148
|
+
d: base64url_js_1.encode(der.subarray(crv === 'Ed448' ? -57 : -56)),
|
|
149
149
|
};
|
|
150
150
|
}
|
|
151
151
|
default:
|
|
@@ -28,7 +28,7 @@ function keyForCrypto(alg, key) {
|
|
|
28
28
|
if (key.asymmetricKeyType !== 'rsa') {
|
|
29
29
|
throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be rsa');
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
check_modulus_length_js_1.default(key, alg);
|
|
32
32
|
return key;
|
|
33
33
|
case rsaPssParams && 'PS256':
|
|
34
34
|
case rsaPssParams && 'PS384':
|
|
@@ -47,7 +47,7 @@ function keyForCrypto(alg, key) {
|
|
|
47
47
|
else if (key.asymmetricKeyType !== 'rsa') {
|
|
48
48
|
throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be rsa or rsa-pss');
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
check_modulus_length_js_1.default(key, alg);
|
|
51
51
|
return {
|
|
52
52
|
key,
|
|
53
53
|
padding: crypto_1.constants.RSA_PKCS1_PSS_PADDING,
|
|
@@ -59,7 +59,7 @@ function keyForCrypto(alg, key) {
|
|
|
59
59
|
if (key.asymmetricKeyType !== 'rsa') {
|
|
60
60
|
throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be rsa');
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
check_modulus_length_js_1.default(key, alg);
|
|
63
63
|
return {
|
|
64
64
|
key,
|
|
65
65
|
padding: crypto_1.constants.RSA_PKCS1_PSS_PADDING,
|
|
@@ -72,7 +72,7 @@ function keyForCrypto(alg, key) {
|
|
|
72
72
|
if (key.asymmetricKeyType !== 'ec') {
|
|
73
73
|
throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be ec');
|
|
74
74
|
}
|
|
75
|
-
const actual =
|
|
75
|
+
const actual = get_named_curve_js_1.default(key);
|
|
76
76
|
const expected = ecCurveAlgMap.get(alg);
|
|
77
77
|
if (actual !== expected) {
|
|
78
78
|
throw new TypeError(`Invalid key curve for the algorithm, its curve must be ${expected}, got ${actual}`);
|
|
@@ -11,35 +11,35 @@ const check_p2s_js_1 = require("../lib/check_p2s.js");
|
|
|
11
11
|
const webcrypto_js_1 = require("./webcrypto.js");
|
|
12
12
|
const is_key_object_js_1 = require("./is_key_object.js");
|
|
13
13
|
const invalid_key_input_js_1 = require("./invalid_key_input.js");
|
|
14
|
-
const pbkdf2 =
|
|
14
|
+
const pbkdf2 = util_1.promisify(crypto_1.pbkdf2);
|
|
15
15
|
function getPassword(key, alg) {
|
|
16
|
-
if (
|
|
16
|
+
if (is_key_object_js_1.default(key)) {
|
|
17
17
|
return key.export();
|
|
18
18
|
}
|
|
19
19
|
if (key instanceof Uint8Array) {
|
|
20
20
|
return key;
|
|
21
21
|
}
|
|
22
|
-
if (
|
|
23
|
-
return
|
|
22
|
+
if (webcrypto_js_1.isCryptoKey(key)) {
|
|
23
|
+
return webcrypto_js_1.getKeyObject(key, alg, new Set(['deriveBits', 'deriveKey'])).export();
|
|
24
24
|
}
|
|
25
|
-
throw new TypeError(
|
|
25
|
+
throw new TypeError(invalid_key_input_js_1.default(key, 'KeyObject', 'CryptoKey', 'Uint8Array'));
|
|
26
26
|
}
|
|
27
|
-
const encrypt = async (alg, key, cek, p2c = Math.floor(Math.random() * 2049) + 2048, p2s =
|
|
28
|
-
|
|
29
|
-
const salt =
|
|
27
|
+
const encrypt = async (alg, key, cek, p2c = Math.floor(Math.random() * 2049) + 2048, p2s = random_js_1.default(new Uint8Array(16))) => {
|
|
28
|
+
check_p2s_js_1.default(p2s);
|
|
29
|
+
const salt = buffer_utils_js_1.p2s(alg, p2s);
|
|
30
30
|
const keylen = parseInt(alg.substr(13, 3), 10) >> 3;
|
|
31
31
|
const password = getPassword(key, alg);
|
|
32
32
|
const derivedKey = await pbkdf2(password, salt, p2c, keylen, `sha${alg.substr(8, 3)}`);
|
|
33
|
-
const encryptedKey = await
|
|
34
|
-
return { encryptedKey, p2c, p2s:
|
|
33
|
+
const encryptedKey = await aeskw_js_1.wrap(alg.substr(-6), derivedKey, cek);
|
|
34
|
+
return { encryptedKey, p2c, p2s: base64url_js_1.encode(p2s) };
|
|
35
35
|
};
|
|
36
36
|
exports.encrypt = encrypt;
|
|
37
37
|
const decrypt = async (alg, key, encryptedKey, p2c, p2s) => {
|
|
38
|
-
|
|
39
|
-
const salt =
|
|
38
|
+
check_p2s_js_1.default(p2s);
|
|
39
|
+
const salt = buffer_utils_js_1.p2s(alg, p2s);
|
|
40
40
|
const keylen = parseInt(alg.substr(13, 3), 10) >> 3;
|
|
41
41
|
const password = getPassword(key, alg);
|
|
42
42
|
const derivedKey = await pbkdf2(password, salt, p2c, keylen, `sha${alg.substr(8, 3)}`);
|
|
43
|
-
return
|
|
43
|
+
return aeskw_js_1.unwrap(alg.substr(-6), derivedKey, encryptedKey);
|
|
44
44
|
};
|
|
45
45
|
exports.decrypt = decrypt;
|
|
@@ -10,7 +10,7 @@ const checkKey = (key, alg) => {
|
|
|
10
10
|
if (key.asymmetricKeyType !== 'rsa') {
|
|
11
11
|
throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be rsa');
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
check_modulus_length_js_1.default(key, alg);
|
|
14
14
|
};
|
|
15
15
|
const resolvePadding = (alg) => {
|
|
16
16
|
switch (alg) {
|
|
@@ -40,20 +40,20 @@ const resolveOaepHash = (alg) => {
|
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
42
|
function ensureKeyObject(key, alg, ...usages) {
|
|
43
|
-
if (
|
|
43
|
+
if (is_key_object_js_1.default(key)) {
|
|
44
44
|
return key;
|
|
45
45
|
}
|
|
46
|
-
if (
|
|
47
|
-
return
|
|
46
|
+
if (webcrypto_js_1.isCryptoKey(key)) {
|
|
47
|
+
return webcrypto_js_1.getKeyObject(key, alg, new Set(usages));
|
|
48
48
|
}
|
|
49
|
-
throw new TypeError(
|
|
49
|
+
throw new TypeError(invalid_key_input_js_1.default(key, 'KeyObject', 'CryptoKey'));
|
|
50
50
|
}
|
|
51
51
|
const encrypt = async (alg, key, cek) => {
|
|
52
52
|
const padding = resolvePadding(alg);
|
|
53
53
|
const oaepHash = resolveOaepHash(alg);
|
|
54
54
|
const keyObject = ensureKeyObject(key, alg, 'wrapKey', 'encrypt');
|
|
55
55
|
checkKey(keyObject, alg);
|
|
56
|
-
return
|
|
56
|
+
return crypto_1.publicEncrypt({ key: keyObject, oaepHash, padding }, cek);
|
|
57
57
|
};
|
|
58
58
|
exports.encrypt = encrypt;
|
|
59
59
|
const decrypt = async (alg, key, encryptedKey) => {
|
|
@@ -61,6 +61,6 @@ const decrypt = async (alg, key, encryptedKey) => {
|
|
|
61
61
|
const oaepHash = resolveOaepHash(alg);
|
|
62
62
|
const keyObject = ensureKeyObject(key, alg, 'unwrapKey', 'decrypt');
|
|
63
63
|
checkKey(keyObject, alg);
|
|
64
|
-
return
|
|
64
|
+
return crypto_1.privateDecrypt({ key: keyObject, oaepHash, padding }, encryptedKey);
|
|
65
65
|
};
|
|
66
66
|
exports.decrypt = decrypt;
|
|
@@ -8,22 +8,22 @@ const node_key_js_1 = require("./node_key.js");
|
|
|
8
8
|
const get_sign_verify_key_js_1 = require("./get_sign_verify_key.js");
|
|
9
9
|
let oneShotSign;
|
|
10
10
|
if (crypto.sign.length > 3) {
|
|
11
|
-
oneShotSign =
|
|
11
|
+
oneShotSign = util_1.promisify(crypto.sign);
|
|
12
12
|
}
|
|
13
13
|
else {
|
|
14
14
|
oneShotSign = crypto.sign;
|
|
15
15
|
}
|
|
16
16
|
const sign = async (alg, key, data) => {
|
|
17
|
-
const keyObject =
|
|
17
|
+
const keyObject = get_sign_verify_key_js_1.default(alg, key, 'sign');
|
|
18
18
|
if (alg.startsWith('HS')) {
|
|
19
19
|
const bitlen = parseInt(alg.substr(-3), 10);
|
|
20
20
|
if (!keyObject.symmetricKeySize || keyObject.symmetricKeySize << 3 < bitlen) {
|
|
21
21
|
throw new TypeError(`${alg} requires symmetric keys to be ${bitlen} bits or larger`);
|
|
22
22
|
}
|
|
23
|
-
const hmac = crypto.createHmac(
|
|
23
|
+
const hmac = crypto.createHmac(hmac_digest_js_1.default(alg), keyObject);
|
|
24
24
|
hmac.update(data);
|
|
25
25
|
return hmac.digest();
|
|
26
26
|
}
|
|
27
|
-
return oneShotSign(
|
|
27
|
+
return oneShotSign(dsa_digest_js_1.default(alg), data, node_key_js_1.default(alg, keyObject));
|
|
28
28
|
};
|
|
29
29
|
exports.default = sign;
|
|
@@ -13,15 +13,15 @@ const [major, minor] = process.version
|
|
|
13
13
|
const oneShotCallbackSupported = major >= 16 || (major === 15 && minor >= 13);
|
|
14
14
|
let oneShotVerify;
|
|
15
15
|
if (crypto.verify.length > 4 && oneShotCallbackSupported) {
|
|
16
|
-
oneShotVerify =
|
|
16
|
+
oneShotVerify = util_1.promisify(crypto.verify);
|
|
17
17
|
}
|
|
18
18
|
else {
|
|
19
19
|
oneShotVerify = crypto.verify;
|
|
20
20
|
}
|
|
21
21
|
const verify = async (alg, key, signature, data) => {
|
|
22
|
-
const keyObject =
|
|
22
|
+
const keyObject = get_sign_verify_key_js_1.default(alg, key, 'verify');
|
|
23
23
|
if (alg.startsWith('HS')) {
|
|
24
|
-
const expected = await
|
|
24
|
+
const expected = await sign_js_1.default(alg, keyObject, data);
|
|
25
25
|
const actual = signature;
|
|
26
26
|
try {
|
|
27
27
|
return crypto.timingSafeEqual(actual, expected);
|
|
@@ -30,8 +30,8 @@ const verify = async (alg, key, signature, data) => {
|
|
|
30
30
|
return false;
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
const algorithm =
|
|
34
|
-
const keyInput =
|
|
33
|
+
const algorithm = dsa_digest_js_1.default(alg);
|
|
34
|
+
const keyInput = node_key_js_1.default(alg, keyObject);
|
|
35
35
|
try {
|
|
36
36
|
return await oneShotVerify(algorithm, data, keyInput, signature);
|
|
37
37
|
}
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.deflate = exports.inflate = void 0;
|
|
4
4
|
const util_1 = require("util");
|
|
5
5
|
const zlib_1 = require("zlib");
|
|
6
|
-
const inflateRaw =
|
|
7
|
-
const deflateRaw =
|
|
6
|
+
const inflateRaw = util_1.promisify(zlib_1.inflateRaw);
|
|
7
|
+
const deflateRaw = util_1.promisify(zlib_1.deflateRaw);
|
|
8
8
|
const inflate = (input) => inflateRaw(input);
|
|
9
9
|
exports.inflate = inflate;
|
|
10
10
|
const deflate = (input) => deflateRaw(input);
|
|
@@ -25,8 +25,8 @@ function decodeProtectedHeader(token) {
|
|
|
25
25
|
if (typeof protectedB64u !== 'string' || !protectedB64u) {
|
|
26
26
|
throw new Error();
|
|
27
27
|
}
|
|
28
|
-
const result = JSON.parse(buffer_utils_js_1.decoder.decode(
|
|
29
|
-
if (!
|
|
28
|
+
const result = JSON.parse(buffer_utils_js_1.decoder.decode(base64url_js_1.decode(protectedB64u)));
|
|
29
|
+
if (!is_object_js_1.default(result)) {
|
|
30
30
|
throw new Error();
|
|
31
31
|
}
|
|
32
32
|
return result;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateKeyPair = void 0;
|
|
4
4
|
const generate_js_1 = require("../runtime/generate.js");
|
|
5
5
|
async function generateKeyPair(alg, options) {
|
|
6
|
-
return
|
|
6
|
+
return generate_js_1.generateKeyPair(alg, options);
|
|
7
7
|
}
|
|
8
8
|
exports.generateKeyPair = generateKeyPair;
|
|
9
9
|
exports.default = generateKeyPair;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateSecret = void 0;
|
|
4
4
|
const generate_js_1 = require("../runtime/generate.js");
|
|
5
5
|
async function generateSecret(alg, options) {
|
|
6
|
-
return
|
|
6
|
+
return generate_js_1.generateSecret(alg, options);
|
|
7
7
|
}
|
|
8
8
|
exports.generateSecret = generateSecret;
|
|
9
9
|
exports.default = generateSecret;
|
|
@@ -95,10 +95,10 @@ async function flattenedDecrypt(jwe, key, options) {
|
|
|
95
95
|
}
|
|
96
96
|
let cek;
|
|
97
97
|
try {
|
|
98
|
-
cek = await decryptKeyManagement(alg, key, encryptedKey, joseHeader);
|
|
98
|
+
cek = await decryptKeyManagement(alg, key, encryptedKey, joseHeader, options);
|
|
99
99
|
}
|
|
100
100
|
catch (err) {
|
|
101
|
-
if (err instanceof TypeError) {
|
|
101
|
+
if (err instanceof TypeError || err instanceof JWEInvalid || err instanceof JOSENotSupported) {
|
|
102
102
|
throw err;
|
|
103
103
|
}
|
|
104
104
|
cek = generateCek(enc);
|
|
@@ -9,7 +9,7 @@ import { bitLengths as cekLengths } from '../lib/cek.js';
|
|
|
9
9
|
import { importJWK } from '../key/import.js';
|
|
10
10
|
import checkKeyType from './check_key_type.js';
|
|
11
11
|
import isObject from './is_object.js';
|
|
12
|
-
async function decryptKeyManagement(alg, key, encryptedKey, joseHeader) {
|
|
12
|
+
async function decryptKeyManagement(alg, key, encryptedKey, joseHeader, options) {
|
|
13
13
|
checkKeyType(alg, key, 'decrypt');
|
|
14
14
|
switch (alg) {
|
|
15
15
|
case 'dir': {
|
|
@@ -63,6 +63,9 @@ async function decryptKeyManagement(alg, key, encryptedKey, joseHeader) {
|
|
|
63
63
|
throw new JWEInvalid('JWE Encrypted Key missing');
|
|
64
64
|
if (typeof joseHeader.p2c !== 'number')
|
|
65
65
|
throw new JWEInvalid(`JOSE Header "p2c" (PBES2 Count) missing or invalid`);
|
|
66
|
+
const p2cLimit = (options === null || options === void 0 ? void 0 : options.maxPBES2Count) || 10000;
|
|
67
|
+
if (joseHeader.p2c > p2cLimit)
|
|
68
|
+
throw new JWEInvalid(`JOSE Header "p2c" (PBES2 Count) out is of acceptable bounds`);
|
|
66
69
|
if (typeof joseHeader.p2s !== 'string')
|
|
67
70
|
throw new JWEInvalid(`JOSE Header "p2s" (PBES2 Salt) missing or invalid`);
|
|
68
71
|
return pbes2Kw(alg, key, encryptedKey, joseHeader.p2c, base64url(joseHeader.p2s));
|
package/dist/types/types.d.ts
CHANGED
|
@@ -199,6 +199,7 @@ export interface DecryptOptions extends CritOption {
|
|
|
199
199
|
keyManagementAlgorithms?: string[]
|
|
200
200
|
contentEncryptionAlgorithms?: string[]
|
|
201
201
|
inflateRaw?: InflateFunction
|
|
202
|
+
maxPBES2Count?: number
|
|
202
203
|
}
|
|
203
204
|
export interface EncryptOptions extends CritOption {
|
|
204
205
|
deflateRaw?: DeflateFunction
|