@suveren/gateway 0.7.6 → 0.8.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/content/integrations/mollie.json +103 -28
- package/dist/mcp-server/http.mjs +228 -118
- package/dist/ui/assets/{index-CsrM6RQr.js → index-BFnSVa9N.js} +22 -22
- package/dist/ui/index.html +1 -1
- package/node_modules/@hap/core/dist/index.d.mts +29 -6
- package/node_modules/@hap/core/dist/index.d.ts +29 -6
- package/node_modules/@hap/core/dist/index.js +54 -8
- package/node_modules/@hap/core/dist/index.mjs +53 -8
- package/node_modules/@hap/core/package.json +2 -1
- package/node_modules/@hap/core/src/frame.ts +115 -14
- package/node_modules/@hap/core/src/gatekeeper.ts +26 -0
- package/node_modules/@hap/core/src/types.ts +7 -1
- package/node_modules/@types/node/README.md +1 -1
- package/node_modules/@types/node/buffer.buffer.d.ts +5 -0
- package/node_modules/@types/node/crypto.d.ts +0 -2
- package/node_modules/@types/node/dgram.d.ts +119 -4
- package/node_modules/@types/node/ffi.d.ts +1 -1
- package/node_modules/@types/node/fs/promises.d.ts +61 -65
- package/node_modules/@types/node/fs.d.ts +86 -76
- package/node_modules/@types/node/http.d.ts +1 -1
- package/node_modules/@types/node/http2.d.ts +2 -2
- package/node_modules/@types/node/index.d.ts +1 -0
- package/node_modules/@types/node/inspector.d.ts +2 -1
- package/node_modules/@types/node/net.d.ts +108 -16
- package/node_modules/@types/node/package.json +2 -2
- package/node_modules/@types/node/quic.d.ts +37 -11
- package/node_modules/@types/node/stream/iter.d.ts +4 -4
- package/node_modules/@types/node/tls.d.ts +24 -0
- package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +5 -0
- package/node_modules/@types/node/ts5.6/index.d.ts +1 -0
- package/node_modules/@types/node/ts5.7/index.d.ts +1 -0
- package/node_modules/@types/node/tty.d.ts +4 -3
- package/node_modules/@types/node/vfs.d.ts +210 -0
- package/node_modules/@types/node/vm.d.ts +1 -1
- package/node_modules/express-rate-limit/dist/index.cjs +6 -3
- package/node_modules/express-rate-limit/dist/index.d.cts +11 -0
- package/node_modules/express-rate-limit/dist/index.d.mts +11 -0
- package/node_modules/express-rate-limit/dist/index.d.ts +11 -0
- package/node_modules/express-rate-limit/dist/index.mjs +6 -3
- package/node_modules/express-rate-limit/{license.md → license} +7 -6
- package/node_modules/express-rate-limit/package.json +5 -5
- package/node_modules/express-rate-limit/readme.md +1 -0
- package/node_modules/fast-uri/index.js +20 -5
- package/node_modules/fast-uri/lib/utils.js +8 -1
- package/node_modules/fast-uri/package.json +1 -1
- package/node_modules/fast-uri/test/component-safe-serialization.test.js +58 -0
- package/node_modules/fast-uri/test/ipv6-validation.test.js +34 -0
- package/node_modules/ip-address/README.md +92 -82
- package/node_modules/ip-address/dist/common.d.ts +20 -0
- package/node_modules/ip-address/dist/common.js +36 -0
- package/node_modules/ip-address/dist/common.js.map +1 -1
- package/node_modules/ip-address/dist/ipv4.d.ts +50 -0
- package/node_modules/ip-address/dist/ipv4.js +75 -0
- package/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/ip-address/dist/ipv6.d.ts +79 -10
- package/node_modules/ip-address/dist/ipv6.js +120 -30
- package/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
- package/node_modules/ip-address/dist/v4/constants.js +40 -1
- package/node_modules/ip-address/dist/v4/constants.js.map +1 -1
- package/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
- package/node_modules/ip-address/dist/v6/constants.js +47 -1
- package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/ip-address/package.json +1 -1
- package/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts +7 -16
- package/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts +6 -17
- package/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts +7 -16
- package/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts +11 -34
- package/node_modules/jose/dist/types/jwe/general/decrypt.d.ts +7 -16
- package/node_modules/jose/dist/types/jwe/general/encrypt.d.ts +15 -35
- package/node_modules/jose/dist/types/jwk/embedded.d.ts +3 -8
- package/node_modules/jose/dist/types/jwk/thumbprint.d.ts +5 -5
- package/node_modules/jose/dist/types/jwks/local.d.ts +6 -10
- package/node_modules/jose/dist/types/jwks/remote.d.ts +13 -24
- package/node_modules/jose/dist/types/jws/compact/sign.d.ts +5 -10
- package/node_modules/jose/dist/types/jws/compact/verify.d.ts +9 -18
- package/node_modules/jose/dist/types/jws/flattened/sign.d.ts +7 -16
- package/node_modules/jose/dist/types/jws/flattened/verify.d.ts +9 -18
- package/node_modules/jose/dist/types/jws/general/sign.d.ts +11 -21
- package/node_modules/jose/dist/types/jws/general/verify.d.ts +9 -18
- package/node_modules/jose/dist/types/jwt/decrypt.d.ts +10 -20
- package/node_modules/jose/dist/types/jwt/encrypt.d.ts +6 -13
- package/node_modules/jose/dist/types/jwt/sign.d.ts +5 -6
- package/node_modules/jose/dist/types/jwt/unsecured.d.ts +9 -14
- package/node_modules/jose/dist/types/jwt/verify.d.ts +9 -19
- package/node_modules/jose/dist/types/key/export.d.ts +4 -4
- package/node_modules/jose/dist/types/key/generate_key_pair.d.ts +6 -8
- package/node_modules/jose/dist/types/key/generate_secret.d.ts +4 -11
- package/node_modules/jose/dist/types/key/import.d.ts +10 -17
- package/node_modules/jose/dist/types/types.d.ts +44 -84
- package/node_modules/jose/dist/types/util/base64url.d.ts +2 -2
- package/node_modules/jose/dist/types/util/decode_jwt.d.ts +3 -10
- package/node_modules/jose/dist/types/util/decode_protected_header.d.ts +4 -4
- package/node_modules/jose/dist/types/util/errors.d.ts +26 -53
- package/node_modules/jose/dist/webapi/index.js +70 -32
- package/node_modules/jose/dist/webapi/jwe/compact/decrypt.js +7 -8
- package/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +42 -48
- package/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +14 -14
- package/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +53 -64
- package/node_modules/jose/dist/webapi/jwe/general/decrypt.js +38 -49
- package/node_modules/jose/dist/webapi/jwe/general/encrypt.js +121 -169
- package/node_modules/jose/dist/webapi/jwk/embedded.js +30 -32
- package/node_modules/jose/dist/webapi/jwk/thumbprint.js +54 -70
- package/node_modules/jose/dist/webapi/jwks/local.js +47 -64
- package/node_modules/jose/dist/webapi/jwks/remote.js +88 -136
- package/node_modules/jose/dist/webapi/jws/compact/sign.js +21 -21
- package/node_modules/jose/dist/webapi/jws/compact/verify.js +7 -8
- package/node_modules/jose/dist/webapi/jws/flattened/sign.js +29 -31
- package/node_modules/jose/dist/webapi/jws/flattened/verify.js +21 -24
- package/node_modules/jose/dist/webapi/jws/general/sign.js +61 -72
- package/node_modules/jose/dist/webapi/jws/general/verify.js +45 -69
- package/node_modules/jose/dist/webapi/jwt/decrypt.js +13 -20
- package/node_modules/jose/dist/webapi/jwt/encrypt.js +57 -70
- package/node_modules/jose/dist/webapi/jwt/sign.js +17 -16
- package/node_modules/jose/dist/webapi/jwt/unsecured.js +32 -40
- package/node_modules/jose/dist/webapi/jwt/verify.js +12 -14
- package/node_modules/jose/dist/webapi/key/export.js +32 -37
- package/node_modules/jose/dist/webapi/key/generate_key_pair.js +40 -48
- package/node_modules/jose/dist/webapi/key/generate_secret.js +35 -40
- package/node_modules/jose/dist/webapi/key/import.js +52 -56
- package/node_modules/jose/dist/webapi/lib/asn1.js +130 -169
- package/node_modules/jose/dist/webapi/lib/base64.js +18 -20
- package/node_modules/jose/dist/webapi/lib/buffer_utils.js +34 -38
- package/node_modules/jose/dist/webapi/lib/content_encryption.js +79 -115
- package/node_modules/jose/dist/webapi/lib/crypto_key.js +24 -25
- package/node_modules/jose/dist/webapi/lib/deflate.js +45 -47
- package/node_modules/jose/dist/webapi/lib/helpers.js +40 -37
- package/node_modules/jose/dist/webapi/lib/invalid_key_input.js +10 -24
- package/node_modules/jose/dist/webapi/lib/is_key_like.js +17 -15
- package/node_modules/jose/dist/webapi/lib/jwe_algorithms.js +106 -93
- package/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +207 -230
- package/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +104 -138
- package/node_modules/jose/dist/webapi/lib/jwk_metadata.js +17 -18
- package/node_modules/jose/dist/webapi/lib/jwk_to_key.js +9 -16
- package/node_modules/jose/dist/webapi/lib/jws_algorithms.js +62 -61
- package/node_modules/jose/dist/webapi/lib/jws_sign.js +50 -75
- package/node_modules/jose/dist/webapi/lib/jws_verify.js +80 -125
- package/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +123 -209
- package/node_modules/jose/dist/webapi/lib/key.js +84 -136
- package/node_modules/jose/dist/webapi/lib/key_algorithm.js +13 -8
- package/node_modules/jose/dist/webapi/lib/key_descriptor.js +8 -6
- package/node_modules/jose/dist/webapi/lib/key_management.js +200 -231
- package/node_modules/jose/dist/webapi/lib/key_options.js +7 -5
- package/node_modules/jose/dist/webapi/lib/options.js +55 -68
- package/node_modules/jose/dist/webapi/lib/signing.js +18 -22
- package/node_modules/jose/dist/webapi/lib/type_checks.js +26 -29
- package/node_modules/jose/dist/webapi/util/base64url.js +26 -35
- package/node_modules/jose/dist/webapi/util/decode_jwt.js +32 -31
- package/node_modules/jose/dist/webapi/util/decode_protected_header.js +18 -23
- package/node_modules/jose/dist/webapi/util/errors.js +94 -84
- package/node_modules/jose/package.json +17 -81
- package/package.json +2 -2
- package/profiles/calendar/0.5.profile.json +190 -0
- package/profiles/charge/0.5.profile.json +210 -0
- package/profiles/customers/0.7.profile.json +157 -0
- package/profiles/deploy/0.9.profile.json +176 -0
- package/profiles/email/0.6.profile.json +208 -0
- package/profiles/index.json +9 -1
- package/profiles/publish/0.5.profile.json +186 -0
- package/profiles/purchase/0.5.profile.json +231 -0
- package/profiles/records/0.5.profile.json +117 -0
|
@@ -1,51 +1,40 @@
|
|
|
1
|
-
import { prepareDecrypt, shareJWE, decryptRecipient, decryptResult, checkRecipient, snapshotSharedJWE, snapshotRecipientJWE
|
|
2
|
-
import { JWEDecryptionFailed, JWEInvalid } from
|
|
3
|
-
import { isObject } from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
let sharedJwe;
|
|
21
|
-
let token;
|
|
22
|
-
try {
|
|
23
|
-
shared = prepareDecrypt(options);
|
|
24
|
-
sharedJwe = snapshotSharedJWE(jwe);
|
|
25
|
-
token = shareJWE(sharedJwe);
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
throw new JWEDecryptionFailed();
|
|
29
|
-
}
|
|
30
|
-
const recipientSnapshots = recipients.map((recipient) => snapshotRecipientJWE(recipient));
|
|
31
|
-
if (recipients.length > 1) {
|
|
32
|
-
for (const [, headerAlg] of recipientSnapshots) {
|
|
33
|
-
const alg = token[0]?.alg ?? headerAlg ?? sharedJwe.unprotected?.alg;
|
|
34
|
-
if (alg === 'dir' || alg === 'ECDH-ES') {
|
|
35
|
-
throw new JWEInvalid(`"${alg}" alg may only have a single recipient`);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
for (const [recipient] of recipientSnapshots) {
|
|
40
|
-
if (!recipient)
|
|
41
|
-
continue;
|
|
42
|
-
try {
|
|
43
|
-
const flattened = { ...sharedJwe, ...recipient };
|
|
44
|
-
checkRecipient(flattened);
|
|
45
|
-
return decryptResult(flattened, await decryptRecipient(flattened, token, shared, key));
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
}
|
|
49
|
-
}
|
|
1
|
+
import { prepareDecrypt, shareJWE, decryptRecipient, decryptResult, checkRecipient, snapshotSharedJWE, snapshotRecipientJWE } from "../../lib/jwe_decrypt.js";
|
|
2
|
+
import { JWEDecryptionFailed, JWEInvalid } from "../../util/errors.js";
|
|
3
|
+
import { isObject } from "../../lib/type_checks.js";
|
|
4
|
+
import { JWE, isJWECEKTransport } from "../../lib/jwe_algorithms.js";
|
|
5
|
+
async function generalDecrypt(jwe, key, options) {
|
|
6
|
+
if (!isObject(jwe))
|
|
7
|
+
throw new JWEInvalid("General JWE must be an object");
|
|
8
|
+
const inputRecipients = jwe.recipients;
|
|
9
|
+
if (!Array.isArray(inputRecipients))
|
|
10
|
+
throw new JWEInvalid("JWE Recipients missing or incorrect type");
|
|
11
|
+
const recipients = Array.from(inputRecipients);
|
|
12
|
+
if (!recipients.every(isObject))
|
|
13
|
+
throw new JWEInvalid("JWE Recipients missing or incorrect type");
|
|
14
|
+
if (!recipients.length)
|
|
15
|
+
throw new JWEInvalid("JWE Recipients has no members");
|
|
16
|
+
let shared, sharedJwe, token;
|
|
17
|
+
try {
|
|
18
|
+
shared = prepareDecrypt(options), sharedJwe = snapshotSharedJWE(jwe), token = shareJWE(sharedJwe);
|
|
19
|
+
} catch {
|
|
50
20
|
throw new JWEDecryptionFailed();
|
|
21
|
+
}
|
|
22
|
+
const recipientSnapshots = recipients.map((recipient) => snapshotRecipientJWE(recipient)), recipientAlgorithms = recipientSnapshots.map(([, headerAlg]) => token[0]?.alg ?? headerAlg ?? sharedJwe.unprotected?.alg);
|
|
23
|
+
if (recipients.length > 1)
|
|
24
|
+
for (const alg of recipientAlgorithms) {
|
|
25
|
+
const algEntry = typeof alg == "string" ? JWE[alg] : void 0;
|
|
26
|
+
if (algEntry && !isJWECEKTransport(algEntry))
|
|
27
|
+
throw new JWEInvalid(`"${alg}" alg may only have a single recipient`);
|
|
28
|
+
}
|
|
29
|
+
for (const [recipient] of recipientSnapshots)
|
|
30
|
+
if (recipient)
|
|
31
|
+
try {
|
|
32
|
+
const flattened = { ...sharedJwe, ...recipient };
|
|
33
|
+
return checkRecipient(flattened), decryptResult(flattened, await decryptRecipient(flattened, token, shared, key));
|
|
34
|
+
} catch {
|
|
35
|
+
}
|
|
36
|
+
throw new JWEDecryptionFailed();
|
|
51
37
|
}
|
|
38
|
+
export {
|
|
39
|
+
generalDecrypt
|
|
40
|
+
};
|
|
@@ -1,177 +1,129 @@
|
|
|
1
|
-
import { assertNotSet } from
|
|
2
|
-
import { JWEInvalid } from
|
|
3
|
-
import { generateCek } from
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { jweAlgorithm } from '../../lib/jwe_algorithms.js';
|
|
9
|
-
import { assertUint8Array } from '../../lib/type_checks.js';
|
|
1
|
+
import { assertNotSet } from "../../lib/helpers.js";
|
|
2
|
+
import { JWEInvalid } from "../../util/errors.js";
|
|
3
|
+
import { generateCek } from "../../lib/content_encryption.js";
|
|
4
|
+
import { encode as b64u } from "../../util/base64url.js";
|
|
5
|
+
import { checkDisjoint, checkEncryptHeaders, createJWE, encryptJWE, transportCek } from "../../lib/jwe_encrypt.js";
|
|
6
|
+
import { JWE, isJWECEKTransport, jweAlgorithm } from "../../lib/jwe_algorithms.js";
|
|
7
|
+
import { assertUint8Array } from "../../lib/type_checks.js";
|
|
10
8
|
class IndividualRecipient {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
setUnprotectedHeader
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return this.#parent.encrypt(...args);
|
|
32
|
-
}
|
|
33
|
-
done() {
|
|
34
|
-
return this.#parent;
|
|
35
|
-
}
|
|
9
|
+
#parent;
|
|
10
|
+
state;
|
|
11
|
+
constructor(enc, key, crit) {
|
|
12
|
+
this.#parent = enc, this.state = [void 0, void 0, key, crit];
|
|
13
|
+
}
|
|
14
|
+
setUnprotectedHeader(unprotectedHeader) {
|
|
15
|
+
return assertNotSet(this.state[0], "setUnprotectedHeader"), this.state[0] = unprotectedHeader, this;
|
|
16
|
+
}
|
|
17
|
+
setKeyManagementParameters(parameters) {
|
|
18
|
+
return assertNotSet(this.state[1], "setKeyManagementParameters"), this.state[1] = parameters, this;
|
|
19
|
+
}
|
|
20
|
+
addRecipient(...args) {
|
|
21
|
+
return this.#parent.addRecipient(...args);
|
|
22
|
+
}
|
|
23
|
+
encrypt(...args) {
|
|
24
|
+
return this.#parent.encrypt(...args);
|
|
25
|
+
}
|
|
26
|
+
done() {
|
|
27
|
+
return this.#parent;
|
|
28
|
+
}
|
|
36
29
|
}
|
|
37
30
|
function copyOptionalMembers(flattened, jwe, recipient) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
jwe.aad = aad;
|
|
41
|
-
if (protectedHeader)
|
|
42
|
-
jwe.protected = protectedHeader;
|
|
43
|
-
if (unprotected)
|
|
44
|
-
jwe.unprotected = unprotected;
|
|
45
|
-
if (header)
|
|
46
|
-
recipient.header = header;
|
|
31
|
+
const { aad, protected: protectedHeader, unprotected, header } = flattened;
|
|
32
|
+
aad && (jwe.aad = aad), protectedHeader && (jwe.protected = protectedHeader), unprotected && (jwe.unprotected = unprotected), header && (recipient.header = header);
|
|
47
33
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
34
|
+
class GeneralEncrypt {
|
|
35
|
+
#plaintext;
|
|
36
|
+
#recipients = [];
|
|
37
|
+
#protectedHeader;
|
|
38
|
+
#unprotectedHeader;
|
|
39
|
+
#aad;
|
|
40
|
+
constructor(plaintext) {
|
|
41
|
+
this.#plaintext = plaintext;
|
|
42
|
+
}
|
|
43
|
+
addRecipient(key, options) {
|
|
44
|
+
const recipient = new IndividualRecipient(this, key, options?.crit);
|
|
45
|
+
return this.#recipients.push(recipient), recipient;
|
|
46
|
+
}
|
|
47
|
+
setProtectedHeader(protectedHeader) {
|
|
48
|
+
return assertNotSet(this.#protectedHeader, "setProtectedHeader"), this.#protectedHeader = protectedHeader, this;
|
|
49
|
+
}
|
|
50
|
+
setSharedUnprotectedHeader(sharedUnprotectedHeader) {
|
|
51
|
+
return assertNotSet(this.#unprotectedHeader, "setSharedUnprotectedHeader"), this.#unprotectedHeader = sharedUnprotectedHeader, this;
|
|
52
|
+
}
|
|
53
|
+
setAdditionalAuthenticatedData(aad) {
|
|
54
|
+
return this.#aad = aad, this;
|
|
55
|
+
}
|
|
56
|
+
async encrypt() {
|
|
57
|
+
if (!this.#recipients.length)
|
|
58
|
+
throw new JWEInvalid("at least one recipient must be added");
|
|
59
|
+
if (assertUint8Array(this.#plaintext, "plaintext"), this.#recipients.length === 1) {
|
|
60
|
+
const [unprotectedHeader, keyManagementParameters, key, crit] = this.#recipients[0].state, flattened = await createJWE([
|
|
61
|
+
this.#plaintext,
|
|
62
|
+
this.#protectedHeader,
|
|
63
|
+
unprotectedHeader,
|
|
64
|
+
this.#unprotectedHeader,
|
|
65
|
+
this.#aad,
|
|
66
|
+
void 0,
|
|
67
|
+
void 0,
|
|
68
|
+
keyManagementParameters,
|
|
69
|
+
crit,
|
|
70
|
+
!1
|
|
71
|
+
], key), jwe2 = {
|
|
72
|
+
ciphertext: flattened.ciphertext,
|
|
73
|
+
recipients: [{}]
|
|
74
|
+
};
|
|
75
|
+
return flattened.iv && (jwe2.iv = flattened.iv), flattened.tag && (jwe2.tag = flattened.tag), flattened.encrypted_key && (jwe2.recipients[0].encrypted_key = flattened.encrypted_key), copyOptionalMembers(flattened, jwe2, jwe2.recipients[0]), jwe2;
|
|
71
76
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
77
|
+
let enc, protectedHeader = this.#protectedHeader, sharedUnprotectedHeader = this.#unprotectedHeader;
|
|
78
|
+
const inputs = [], checked = [];
|
|
79
|
+
for (let i = 0; i < this.#recipients.length; i++) {
|
|
80
|
+
const recipient = this.#recipients[i], [unprotectedHeader, keyManagementParameters, , crit] = recipient.state, input = [
|
|
81
|
+
this.#plaintext,
|
|
82
|
+
protectedHeader,
|
|
83
|
+
unprotectedHeader,
|
|
84
|
+
sharedUnprotectedHeader,
|
|
85
|
+
this.#aad,
|
|
86
|
+
void 0,
|
|
87
|
+
void 0,
|
|
88
|
+
keyManagementParameters,
|
|
89
|
+
crit,
|
|
90
|
+
!0
|
|
91
|
+
], headers = checkEncryptHeaders(input);
|
|
92
|
+
inputs.push(input), checked.push(headers), i === 0 && (protectedHeader = input[1], sharedUnprotectedHeader = input[3]);
|
|
93
|
+
const algEntry = JWE[headers[1]];
|
|
94
|
+
if (algEntry && !isJWECEKTransport(algEntry))
|
|
95
|
+
throw new JWEInvalid(`"${headers[1]}" alg may only have a single recipient`);
|
|
96
|
+
if (!enc)
|
|
97
|
+
enc = headers[2];
|
|
98
|
+
else if (enc !== headers[2])
|
|
99
|
+
throw new JWEInvalid('JWE "enc" (Encryption Algorithm) Header Parameter must be the same for all recipients');
|
|
75
100
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
recipients: [{}],
|
|
99
|
-
tag: flattened.tag,
|
|
100
|
-
};
|
|
101
|
-
if (flattened.encrypted_key)
|
|
102
|
-
jwe.recipients[0].encrypted_key = flattened.encrypted_key;
|
|
103
|
-
copyOptionalMembers(flattened, jwe, jwe.recipients[0]);
|
|
104
|
-
return jwe;
|
|
105
|
-
}
|
|
106
|
-
let enc;
|
|
107
|
-
let protectedHeader = this.#protectedHeader;
|
|
108
|
-
let sharedUnprotectedHeader = this.#unprotectedHeader;
|
|
109
|
-
const inputs = [];
|
|
110
|
-
const checked = [];
|
|
111
|
-
for (let i = 0; i < this.#recipients.length; i++) {
|
|
112
|
-
const recipient = this.#recipients[i];
|
|
113
|
-
const [unprotectedHeader, keyManagementParameters, , crit] = recipient.state;
|
|
114
|
-
const input = [
|
|
115
|
-
this.#plaintext,
|
|
116
|
-
protectedHeader,
|
|
117
|
-
unprotectedHeader,
|
|
118
|
-
sharedUnprotectedHeader,
|
|
119
|
-
this.#aad,
|
|
120
|
-
undefined,
|
|
121
|
-
undefined,
|
|
122
|
-
keyManagementParameters,
|
|
123
|
-
crit,
|
|
124
|
-
true,
|
|
125
|
-
];
|
|
126
|
-
const headers = checkEncryptHeaders(input);
|
|
127
|
-
inputs.push(input);
|
|
128
|
-
checked.push(headers);
|
|
129
|
-
if (i === 0) {
|
|
130
|
-
protectedHeader = input[1];
|
|
131
|
-
sharedUnprotectedHeader = input[3];
|
|
132
|
-
}
|
|
133
|
-
if (headers[1] === 'dir' || headers[1] === 'ECDH-ES') {
|
|
134
|
-
throw new JWEInvalid(`"${headers[1]}" alg may only have a single recipient`);
|
|
135
|
-
}
|
|
136
|
-
if (!enc) {
|
|
137
|
-
enc = headers[2];
|
|
138
|
-
}
|
|
139
|
-
else if (enc !== headers[2]) {
|
|
140
|
-
throw new JWEInvalid('JWE "enc" (Encryption Algorithm) Header Parameter must be the same for all recipients');
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
const cek = generateCek(checked[0][3]);
|
|
144
|
-
const jwe = {
|
|
145
|
-
ciphertext: '',
|
|
146
|
-
recipients: [],
|
|
147
|
-
};
|
|
148
|
-
for (let i = 0; i < this.#recipients.length; i++) {
|
|
149
|
-
const recipient = this.#recipients[i];
|
|
150
|
-
const [, keyManagementParameters, key] = recipient.state;
|
|
151
|
-
const target = {};
|
|
152
|
-
jwe.recipients.push(target);
|
|
153
|
-
if (i === 0) {
|
|
154
|
-
inputs[0][5] = cek;
|
|
155
|
-
const flattened = await encryptJWE(inputs[0], checked[0], key);
|
|
156
|
-
jwe.ciphertext = flattened.ciphertext;
|
|
157
|
-
jwe.iv = flattened.iv;
|
|
158
|
-
jwe.tag = flattened.tag;
|
|
159
|
-
target.encrypted_key = flattened.encrypted_key;
|
|
160
|
-
copyOptionalMembers(flattened, jwe, target);
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
const [, alg, , encEntry] = checked[i];
|
|
164
|
-
const unprotectedHeader = inputs[i][2];
|
|
165
|
-
const k = await prepareKey(jweAlgorithm(alg), key, 'encrypt');
|
|
166
|
-
const [, encryptedKey, parameters] = await encryptKeyManagement(alg, encEntry, k, cek, keyManagementParameters);
|
|
167
|
-
target.encrypted_key = b64u(encryptedKey);
|
|
168
|
-
if (unprotectedHeader || parameters) {
|
|
169
|
-
const header = { ...unprotectedHeader, ...parameters };
|
|
170
|
-
if (parameters)
|
|
171
|
-
checkDisjoint(inputs[i][1], header, inputs[i][3]);
|
|
172
|
-
target.header = header;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
return jwe;
|
|
101
|
+
const algEntries = checked.map(([, alg]) => {
|
|
102
|
+
const algEntry = jweAlgorithm(alg);
|
|
103
|
+
if (!isJWECEKTransport(algEntry))
|
|
104
|
+
throw new JWEInvalid(`"${alg}" alg may only have a single recipient`);
|
|
105
|
+
return algEntry;
|
|
106
|
+
}), cek = generateCek(checked[0][3]), jwe = {
|
|
107
|
+
ciphertext: "",
|
|
108
|
+
recipients: []
|
|
109
|
+
};
|
|
110
|
+
for (let i = 0; i < this.#recipients.length; i++) {
|
|
111
|
+
const recipient = this.#recipients[i], [, keyManagementParameters, key] = recipient.state, target = {};
|
|
112
|
+
if (jwe.recipients.push(target), i === 0) {
|
|
113
|
+
inputs[0][5] = cek;
|
|
114
|
+
const flattened = await encryptJWE(inputs[0], checked[0], key, algEntries[0]);
|
|
115
|
+
jwe.ciphertext = flattened.ciphertext, flattened.iv && (jwe.iv = flattened.iv), flattened.tag && (jwe.tag = flattened.tag), flattened.encrypted_key && (target.encrypted_key = flattened.encrypted_key), copyOptionalMembers(flattened, jwe, target);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const [joseHeader, , , encEntry] = checked[i], unprotectedHeader = inputs[i][2], [, encryptedKey, parameters] = await transportCek(algEntries[i], encEntry, key, cek, joseHeader, keyManagementParameters);
|
|
119
|
+
if (target.encrypted_key = b64u(encryptedKey), unprotectedHeader || parameters) {
|
|
120
|
+
const header = { ...unprotectedHeader, ...parameters };
|
|
121
|
+
parameters && checkDisjoint(inputs[i][1], header, inputs[i][3]), target.header = header;
|
|
122
|
+
}
|
|
176
123
|
}
|
|
124
|
+
return jwe;
|
|
125
|
+
}
|
|
177
126
|
}
|
|
127
|
+
export {
|
|
128
|
+
GeneralEncrypt
|
|
129
|
+
};
|
|
@@ -1,33 +1,31 @@
|
|
|
1
|
-
import { jwkToKey } from
|
|
2
|
-
import { jwsAlgorithm } from
|
|
3
|
-
import { isObject } from
|
|
4
|
-
import { JWSInvalid } from
|
|
5
|
-
import { normalizeJwk } from
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const key = await jwkToKey(entry, { ...jwk, ext: true });
|
|
29
|
-
if (key.type !== 'public') {
|
|
30
|
-
throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a public key');
|
|
31
|
-
}
|
|
32
|
-
return key;
|
|
1
|
+
import { jwkToKey } from "../lib/jwk_to_key.js";
|
|
2
|
+
import { jwsAlgorithm } from "../lib/jws_algorithms.js";
|
|
3
|
+
import { isObject } from "../lib/type_checks.js";
|
|
4
|
+
import { JWSInvalid } from "../util/errors.js";
|
|
5
|
+
import { normalizeJwk } from "../lib/jwk_metadata.js";
|
|
6
|
+
async function EmbeddedJWK(protectedHeader, token) {
|
|
7
|
+
const joseHeader = {
|
|
8
|
+
...protectedHeader,
|
|
9
|
+
...token?.header
|
|
10
|
+
};
|
|
11
|
+
if (!isObject(joseHeader.jwk))
|
|
12
|
+
throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a JSON object');
|
|
13
|
+
let jwk;
|
|
14
|
+
try {
|
|
15
|
+
jwk = normalizeJwk(joseHeader.jwk);
|
|
16
|
+
} catch (cause) {
|
|
17
|
+
throw new JWSInvalid("Invalid Embedded JWK", { cause });
|
|
18
|
+
}
|
|
19
|
+
const entry = jwsAlgorithm(joseHeader.alg);
|
|
20
|
+
if (jwk.use !== void 0 && jwk.use !== "sig")
|
|
21
|
+
throw new JWSInvalid('Invalid Embedded JWK, its "use" must be "sig" when present');
|
|
22
|
+
if (jwk.alg !== void 0 && jwk.alg !== entry.alg)
|
|
23
|
+
throw new JWSInvalid(`Invalid Embedded JWK, its "alg" must be "${entry.alg}" when present`);
|
|
24
|
+
const key = await jwkToKey(entry, { ...jwk, ext: !0 });
|
|
25
|
+
if (key.type !== "public")
|
|
26
|
+
throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a public key');
|
|
27
|
+
return key;
|
|
33
28
|
}
|
|
29
|
+
export {
|
|
30
|
+
EmbeddedJWK
|
|
31
|
+
};
|
|
@@ -1,74 +1,58 @@
|
|
|
1
|
-
import { digest } from
|
|
2
|
-
import { encode as b64u } from
|
|
3
|
-
import { JOSENotSupported, JWKInvalid } from
|
|
4
|
-
import { encode } from
|
|
5
|
-
import { isKeyLike } from
|
|
6
|
-
import { isObject } from
|
|
7
|
-
import { exportJWK } from
|
|
8
|
-
import { invalidKeyInput } from
|
|
9
|
-
import { snapshotJwk } from
|
|
1
|
+
import { digest } from "../lib/helpers.js";
|
|
2
|
+
import { encode as b64u } from "../util/base64url.js";
|
|
3
|
+
import { JOSENotSupported, JWKInvalid } from "../util/errors.js";
|
|
4
|
+
import { encode } from "../lib/buffer_utils.js";
|
|
5
|
+
import { isKeyLike } from "../lib/is_key_like.js";
|
|
6
|
+
import { isObject } from "../lib/type_checks.js";
|
|
7
|
+
import { exportJWK } from "../key/export.js";
|
|
8
|
+
import { invalidKeyInput } from "../lib/invalid_key_input.js";
|
|
9
|
+
import { snapshotJwk } from "../lib/jwk_metadata.js";
|
|
10
10
|
const check = (value, description) => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
11
|
+
if (typeof value != "string" || !value)
|
|
12
|
+
throw new JWKInvalid(`${description} missing or invalid`);
|
|
14
13
|
};
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
check(jwk.x, '"x" (Public Key) Parameter');
|
|
51
|
-
components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x };
|
|
52
|
-
break;
|
|
53
|
-
case 'RSA':
|
|
54
|
-
check(jwk.e, '"e" (Exponent) Parameter');
|
|
55
|
-
check(jwk.n, '"n" (Modulus) Parameter');
|
|
56
|
-
components = { e: jwk.e, kty: jwk.kty, n: jwk.n };
|
|
57
|
-
break;
|
|
58
|
-
case 'oct':
|
|
59
|
-
if (typeof jwk.k !== 'string') {
|
|
60
|
-
throw new JWKInvalid('"k" (Key Value) Parameter missing or invalid');
|
|
61
|
-
}
|
|
62
|
-
components = { k: jwk.k, kty: jwk.kty };
|
|
63
|
-
break;
|
|
64
|
-
default:
|
|
65
|
-
throw new JOSENotSupported('"kty" (Key Type) Parameter missing or unsupported');
|
|
66
|
-
}
|
|
67
|
-
const data = encode(JSON.stringify(components));
|
|
68
|
-
return b64u(await digest(digestAlgorithm, data));
|
|
14
|
+
async function calculateJwkThumbprint(key, digestAlgorithm) {
|
|
15
|
+
let jwk;
|
|
16
|
+
if (isObject(key)) {
|
|
17
|
+
if (jwk = snapshotJwk(key), typeof jwk.kty != "string")
|
|
18
|
+
throw new TypeError(invalidKeyInput(key, "CryptoKey", "KeyObject", "JSON Web Key"));
|
|
19
|
+
} else if (isKeyLike(key))
|
|
20
|
+
jwk = snapshotJwk(await exportJWK(key));
|
|
21
|
+
else
|
|
22
|
+
throw new TypeError(invalidKeyInput(key, "CryptoKey", "KeyObject", "JSON Web Key"));
|
|
23
|
+
if (digestAlgorithm ??= "sha256", digestAlgorithm !== "sha256" && digestAlgorithm !== "sha384" && digestAlgorithm !== "sha512")
|
|
24
|
+
throw new TypeError('digestAlgorithm must one of "sha256", "sha384", or "sha512"');
|
|
25
|
+
let components;
|
|
26
|
+
switch (jwk.kty) {
|
|
27
|
+
case "AKP":
|
|
28
|
+
check(jwk.alg, '"alg" (Algorithm) Parameter'), check(jwk.pub, '"pub" (Public key) Parameter'), components = { alg: jwk.alg, kty: jwk.kty, pub: jwk.pub };
|
|
29
|
+
break;
|
|
30
|
+
case "EC":
|
|
31
|
+
check(jwk.crv, '"crv" (Curve) Parameter'), check(jwk.x, '"x" (X Coordinate) Parameter'), check(jwk.y, '"y" (Y Coordinate) Parameter'), components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y };
|
|
32
|
+
break;
|
|
33
|
+
case "OKP":
|
|
34
|
+
check(jwk.crv, '"crv" (Subtype of Key Pair) Parameter'), check(jwk.x, '"x" (Public Key) Parameter'), components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x };
|
|
35
|
+
break;
|
|
36
|
+
case "RSA":
|
|
37
|
+
check(jwk.e, '"e" (Exponent) Parameter'), check(jwk.n, '"n" (Modulus) Parameter'), components = { e: jwk.e, kty: jwk.kty, n: jwk.n };
|
|
38
|
+
break;
|
|
39
|
+
case "oct":
|
|
40
|
+
if (typeof jwk.k != "string")
|
|
41
|
+
throw new JWKInvalid('"k" (Key Value) Parameter missing or invalid');
|
|
42
|
+
components = { k: jwk.k, kty: jwk.kty };
|
|
43
|
+
break;
|
|
44
|
+
default:
|
|
45
|
+
throw new JOSENotSupported('"kty" (Key Type) Parameter missing or unsupported');
|
|
46
|
+
}
|
|
47
|
+
const data = encode(JSON.stringify(components));
|
|
48
|
+
return b64u(await digest(digestAlgorithm, data));
|
|
69
49
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
50
|
+
async function calculateJwkThumbprintUri(key, digestAlgorithm) {
|
|
51
|
+
digestAlgorithm ??= "sha256";
|
|
52
|
+
const thumbprint = await calculateJwkThumbprint(key, digestAlgorithm);
|
|
53
|
+
return `urn:ietf:params:oauth:jwk-thumbprint:sha-${digestAlgorithm.slice(-3)}:${thumbprint}`;
|
|
74
54
|
}
|
|
55
|
+
export {
|
|
56
|
+
calculateJwkThumbprint,
|
|
57
|
+
calculateJwkThumbprintUri
|
|
58
|
+
};
|