@lindorm/aegis 0.1.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/CHANGELOG.md +10 -0
- package/README.md +1 -0
- package/dist/classes/Aegis.d.ts +27 -0
- package/dist/classes/Aegis.d.ts.map +1 -0
- package/dist/classes/Aegis.js +113 -0
- package/dist/classes/Aegis.js.map +1 -0
- package/dist/classes/AegisVault.d.ts +24 -0
- package/dist/classes/AegisVault.d.ts.map +1 -0
- package/dist/classes/AegisVault.js +141 -0
- package/dist/classes/AegisVault.js.map +1 -0
- package/dist/classes/JweKit.d.ts +13 -0
- package/dist/classes/JweKit.d.ts.map +1 -0
- package/dist/classes/JweKit.js +154 -0
- package/dist/classes/JweKit.js.map +1 -0
- package/dist/classes/JwsKit.d.ts +11 -0
- package/dist/classes/JwsKit.d.ts.map +1 -0
- package/dist/classes/JwsKit.js +95 -0
- package/dist/classes/JwsKit.js.map +1 -0
- package/dist/classes/JwtKit.d.ts +14 -0
- package/dist/classes/JwtKit.d.ts.map +1 -0
- package/dist/classes/JwtKit.js +127 -0
- package/dist/classes/JwtKit.js.map +1 -0
- package/dist/classes/index.d.ts +6 -0
- package/dist/classes/index.d.ts.map +1 -0
- package/dist/classes/index.js +22 -0
- package/dist/classes/index.js.map +1 -0
- package/dist/errors/AegisError.d.ts +4 -0
- package/dist/errors/AegisError.d.ts.map +1 -0
- package/dist/errors/AegisError.js +8 -0
- package/dist/errors/AegisError.js.map +1 -0
- package/dist/errors/AegisVaultError.d.ts +4 -0
- package/dist/errors/AegisVaultError.d.ts.map +1 -0
- package/dist/errors/AegisVaultError.js +8 -0
- package/dist/errors/AegisVaultError.js.map +1 -0
- package/dist/errors/JweError.d.ts +4 -0
- package/dist/errors/JweError.d.ts.map +1 -0
- package/dist/errors/JweError.js +8 -0
- package/dist/errors/JweError.js.map +1 -0
- package/dist/errors/JwsError.d.ts +4 -0
- package/dist/errors/JwsError.d.ts.map +1 -0
- package/dist/errors/JwsError.js +8 -0
- package/dist/errors/JwsError.js.map +1 -0
- package/dist/errors/JwtError.d.ts +4 -0
- package/dist/errors/JwtError.d.ts.map +1 -0
- package/dist/errors/JwtError.js +8 -0
- package/dist/errors/JwtError.js.map +1 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +22 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/types/aegis-vault.d.ts +29 -0
- package/dist/types/aegis-vault.d.ts.map +1 -0
- package/dist/types/aegis-vault.js +3 -0
- package/dist/types/aegis-vault.js.map +1 -0
- package/dist/types/aegis.d.ts +14 -0
- package/dist/types/aegis.d.ts.map +1 -0
- package/dist/types/aegis.js +3 -0
- package/dist/types/aegis.js.map +1 -0
- package/dist/types/header.d.ts +63 -0
- package/dist/types/header.d.ts.map +1 -0
- package/dist/types/header.js +3 -0
- package/dist/types/header.js.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +27 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/interfaces/aegis-vault.d.ts +12 -0
- package/dist/types/interfaces/aegis-vault.d.ts.map +1 -0
- package/dist/types/interfaces/aegis-vault.js +3 -0
- package/dist/types/interfaces/aegis-vault.js.map +1 -0
- package/dist/types/interfaces/aegis.d.ts +22 -0
- package/dist/types/interfaces/aegis.d.ts.map +1 -0
- package/dist/types/interfaces/aegis.js +3 -0
- package/dist/types/interfaces/aegis.js.map +1 -0
- package/dist/types/interfaces/index.d.ts +6 -0
- package/dist/types/interfaces/index.d.ts.map +1 -0
- package/dist/types/interfaces/index.js +22 -0
- package/dist/types/interfaces/index.js.map +1 -0
- package/dist/types/interfaces/jwe-kit.d.ts +7 -0
- package/dist/types/interfaces/jwe-kit.d.ts.map +1 -0
- package/dist/types/interfaces/jwe-kit.js +3 -0
- package/dist/types/interfaces/jwe-kit.js.map +1 -0
- package/dist/types/interfaces/jws-kit.d.ts +6 -0
- package/dist/types/interfaces/jws-kit.d.ts.map +1 -0
- package/dist/types/interfaces/jws-kit.js +3 -0
- package/dist/types/interfaces/jws-kit.js.map +1 -0
- package/dist/types/interfaces/jwt-kit.d.ts +8 -0
- package/dist/types/interfaces/jwt-kit.d.ts.map +1 -0
- package/dist/types/interfaces/jwt-kit.js +3 -0
- package/dist/types/interfaces/jwt-kit.js.map +1 -0
- package/dist/types/jwe/index.d.ts +5 -0
- package/dist/types/jwe/index.d.ts.map +1 -0
- package/dist/types/jwe/index.js +21 -0
- package/dist/types/jwe/index.js.map +1 -0
- package/dist/types/jwe/jwe-decode.d.ts +9 -0
- package/dist/types/jwe/jwe-decode.d.ts.map +1 -0
- package/dist/types/jwe/jwe-decode.js +3 -0
- package/dist/types/jwe/jwe-decode.js.map +1 -0
- package/dist/types/jwe/jwe-decrypt.d.ts +14 -0
- package/dist/types/jwe/jwe-decrypt.d.ts.map +1 -0
- package/dist/types/jwe/jwe-decrypt.js +3 -0
- package/dist/types/jwe/jwe-decrypt.js.map +1 -0
- package/dist/types/jwe/jwe-encrypt.d.ts +7 -0
- package/dist/types/jwe/jwe-encrypt.d.ts.map +1 -0
- package/dist/types/jwe/jwe-encrypt.js +3 -0
- package/dist/types/jwe/jwe-encrypt.js.map +1 -0
- package/dist/types/jwe/jwe-kit.d.ts +9 -0
- package/dist/types/jwe/jwe-kit.d.ts.map +1 -0
- package/dist/types/jwe/jwe-kit.js +3 -0
- package/dist/types/jwe/jwe-kit.js.map +1 -0
- package/dist/types/jws/index.d.ts +5 -0
- package/dist/types/jws/index.d.ts.map +1 -0
- package/dist/types/jws/index.js +21 -0
- package/dist/types/jws/index.js.map +1 -0
- package/dist/types/jws/jws-decode.d.ts +7 -0
- package/dist/types/jws/jws-decode.d.ts.map +1 -0
- package/dist/types/jws/jws-decode.js +3 -0
- package/dist/types/jws/jws-decode.js.map +1 -0
- package/dist/types/jws/jws-kit.d.ts +9 -0
- package/dist/types/jws/jws-kit.d.ts.map +1 -0
- package/dist/types/jws/jws-kit.js +3 -0
- package/dist/types/jws/jws-kit.js.map +1 -0
- package/dist/types/jws/jws-sign.d.ts +9 -0
- package/dist/types/jws/jws-sign.d.ts.map +1 -0
- package/dist/types/jws/jws-sign.js +3 -0
- package/dist/types/jws/jws-sign.js.map +1 -0
- package/dist/types/jws/jws-verify.d.ts +14 -0
- package/dist/types/jws/jws-verify.d.ts.map +1 -0
- package/dist/types/jws/jws-verify.js +3 -0
- package/dist/types/jws/jws-verify.js.map +1 -0
- package/dist/types/jwt/index.d.ts +8 -0
- package/dist/types/jwt/index.d.ts.map +1 -0
- package/dist/types/jwt/index.js +24 -0
- package/dist/types/jwt/index.js.map +1 -0
- package/dist/types/jwt/jwt-claims.d.ts +38 -0
- package/dist/types/jwt/jwt-claims.d.ts.map +1 -0
- package/dist/types/jwt/jwt-claims.js +3 -0
- package/dist/types/jwt/jwt-claims.js.map +1 -0
- package/dist/types/jwt/jwt-decode.d.ts +9 -0
- package/dist/types/jwt/jwt-decode.d.ts.map +1 -0
- package/dist/types/jwt/jwt-decode.js +3 -0
- package/dist/types/jwt/jwt-decode.js.map +1 -0
- package/dist/types/jwt/jwt-kit.d.ts +9 -0
- package/dist/types/jwt/jwt-kit.d.ts.map +1 -0
- package/dist/types/jwt/jwt-kit.js +3 -0
- package/dist/types/jwt/jwt-kit.js.map +1 -0
- package/dist/types/jwt/jwt-parse.d.ts +34 -0
- package/dist/types/jwt/jwt-parse.d.ts.map +1 -0
- package/dist/types/jwt/jwt-parse.js +3 -0
- package/dist/types/jwt/jwt-parse.js.map +1 -0
- package/dist/types/jwt/jwt-sign.d.ts +48 -0
- package/dist/types/jwt/jwt-sign.d.ts.map +1 -0
- package/dist/types/jwt/jwt-sign.js +3 -0
- package/dist/types/jwt/jwt-sign.js.map +1 -0
- package/dist/types/jwt/jwt-validate.d.ts +32 -0
- package/dist/types/jwt/jwt-validate.d.ts.map +1 -0
- package/dist/types/jwt/jwt-validate.js +3 -0
- package/dist/types/jwt/jwt-validate.js.map +1 -0
- package/dist/types/jwt/jwt-verify.d.ts +41 -0
- package/dist/types/jwt/jwt-verify.d.ts.map +1 -0
- package/dist/types/jwt/jwt-verify.js +3 -0
- package/dist/types/jwt/jwt-verify.js.map +1 -0
- package/dist/types/level-of-assurance.d.ts +3 -0
- package/dist/types/level-of-assurance.d.ts.map +1 -0
- package/dist/types/level-of-assurance.js +3 -0
- package/dist/types/level-of-assurance.js.map +1 -0
- package/dist/types/oidc.d.ts +27 -0
- package/dist/types/oidc.d.ts.map +1 -0
- package/dist/types/oidc.js +3 -0
- package/dist/types/oidc.js.map +1 -0
- package/dist/types/operators.d.ts +27 -0
- package/dist/types/operators.d.ts.map +1 -0
- package/dist/types/operators.js +3 -0
- package/dist/types/operators.js.map +1 -0
- package/dist/utils/private/create-hash.d.ts +8 -0
- package/dist/utils/private/create-hash.d.ts.map +1 -0
- package/dist/utils/private/create-hash.js +30 -0
- package/dist/utils/private/create-hash.js.map +1 -0
- package/dist/utils/private/create-token-signature.d.ts +9 -0
- package/dist/utils/private/create-token-signature.d.ts.map +1 -0
- package/dist/utils/private/create-token-signature.js +41 -0
- package/dist/utils/private/create-token-signature.js.map +1 -0
- package/dist/utils/private/jwt-payload.d.ts +20 -0
- package/dist/utils/private/jwt-payload.d.ts.map +1 -0
- package/dist/utils/private/jwt-payload.js +132 -0
- package/dist/utils/private/jwt-payload.js.map +1 -0
- package/dist/utils/private/jwt-validate.d.ts +4 -0
- package/dist/utils/private/jwt-validate.d.ts.map +1 -0
- package/dist/utils/private/jwt-validate.js +45 -0
- package/dist/utils/private/jwt-validate.js.map +1 -0
- package/dist/utils/private/jwt-verify.d.ts +5 -0
- package/dist/utils/private/jwt-verify.d.ts.map +1 -0
- package/dist/utils/private/jwt-verify.js +109 -0
- package/dist/utils/private/jwt-verify.js.map +1 -0
- package/dist/utils/private/token-header.d.ts +5 -0
- package/dist/utils/private/token-header.d.ts.map +1 -0
- package/dist/utils/private/token-header.js +193 -0
- package/dist/utils/private/token-header.js.map +1 -0
- package/dist/utils/private/token-type.d.ts +3 -0
- package/dist/utils/private/token-type.d.ts.map +1 -0
- package/dist/utils/private/token-type.js +11 -0
- package/dist/utils/private/token-type.js.map +1 -0
- package/dist/utils/private/validate-value.d.ts +3 -0
- package/dist/utils/private/validate-value.d.ts.map +1 -0
- package/dist/utils/private/validate-value.js +91 -0
- package/dist/utils/private/validate-value.js.map +1 -0
- package/dist/utils/private/validate.d.ts +4 -0
- package/dist/utils/private/validate.d.ts.map +1 -0
- package/dist/utils/private/validate.js +19 -0
- package/dist/utils/private/validate.js.map +1 -0
- package/dist/utils/private/verify-token-signature.d.ts +3 -0
- package/dist/utils/private/verify-token-signature.d.ts.map +1 -0
- package/dist/utils/private/verify-token-signature.js +42 -0
- package/dist/utils/private/verify-token-signature.js.map +1 -0
- package/package.json +49 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
+
|
|
6
|
+
# 0.1.0 (2024-05-19)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- initialise aegis package ([b0eb954](https://github.com/lindorm-io/monorepo/commit/b0eb954d9015bd965a3120980edaceaff55e9ccb))
|
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# @lindorm/aegis
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AegisOptions, IAegis, IAegisJwe, IAegisJws, IAegisJwt } from "../types";
|
|
2
|
+
export declare class Aegis implements IAegis {
|
|
3
|
+
private readonly clockTolerance;
|
|
4
|
+
private readonly encAlgorithm;
|
|
5
|
+
private readonly encryption;
|
|
6
|
+
private readonly issuer;
|
|
7
|
+
private readonly kryptosMayOverrideEncryption;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
private readonly sigAlgorithm;
|
|
10
|
+
private readonly vault;
|
|
11
|
+
constructor(options: AegisOptions);
|
|
12
|
+
get jwe(): IAegisJwe;
|
|
13
|
+
get jws(): IAegisJws;
|
|
14
|
+
get jwt(): IAegisJwt;
|
|
15
|
+
private jweKit;
|
|
16
|
+
private jweEncrypt;
|
|
17
|
+
private jweDecrypt;
|
|
18
|
+
private jwsKit;
|
|
19
|
+
private jwsSign;
|
|
20
|
+
private jwsVerify;
|
|
21
|
+
private jwtKit;
|
|
22
|
+
private jwtSign;
|
|
23
|
+
private jwtVerify;
|
|
24
|
+
private kryptosEnc;
|
|
25
|
+
private kryptosSig;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=Aegis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Aegis.d.ts","sourceRoot":"","sources":["../../src/classes/Aegis.ts"],"names":[],"mappings":"AASA,OAAO,EACL,YAAY,EAGZ,MAAM,EACN,SAAS,EACT,SAAS,EACT,SAAS,EAYV,MAAM,UAAU,CAAC;AAKlB,qBAAa,KAAM,YAAW,MAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAU;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;gBAEjB,OAAO,EAAE,YAAY;IAYxC,IAAW,GAAG,IAAI,SAAS,CAK1B;IAED,IAAW,GAAG,IAAI,SAAS,CAK1B;IAED,IAAW,GAAG,IAAI,SAAS,CAK1B;YAIa,MAAM;YAWN,UAAU;YAQV,UAAU;YAOV,MAAM;YAMN,OAAO;YAQP,SAAS;YAOT,MAAM;YAWN,OAAO;YAQP,SAAS;YAUT,UAAU;YAaV,UAAU;CAazB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Aegis = void 0;
|
|
4
|
+
const JweKit_1 = require("./JweKit");
|
|
5
|
+
const JwsKit_1 = require("./JwsKit");
|
|
6
|
+
const JwtKit_1 = require("./JwtKit");
|
|
7
|
+
class Aegis {
|
|
8
|
+
clockTolerance;
|
|
9
|
+
encAlgorithm;
|
|
10
|
+
encryption;
|
|
11
|
+
issuer;
|
|
12
|
+
kryptosMayOverrideEncryption;
|
|
13
|
+
logger;
|
|
14
|
+
sigAlgorithm;
|
|
15
|
+
vault;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.logger = options.logger.child(["AegisKit"]);
|
|
18
|
+
this.vault = options.vault;
|
|
19
|
+
this.issuer = options.issuer;
|
|
20
|
+
this.clockTolerance = options.clockTolerance ?? 0;
|
|
21
|
+
this.encAlgorithm = options.encAlgorithm;
|
|
22
|
+
this.encryption = options.encryption ?? "A256GCM";
|
|
23
|
+
this.kryptosMayOverrideEncryption = options.kryptosMayOverrideEncryption ?? true;
|
|
24
|
+
this.sigAlgorithm = options.sigAlgorithm;
|
|
25
|
+
}
|
|
26
|
+
get jwe() {
|
|
27
|
+
return {
|
|
28
|
+
encrypt: this.jweEncrypt.bind(this),
|
|
29
|
+
decrypt: this.jweDecrypt.bind(this),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
get jws() {
|
|
33
|
+
return {
|
|
34
|
+
sign: this.jwsSign.bind(this),
|
|
35
|
+
verify: this.jwsVerify.bind(this),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
get jwt() {
|
|
39
|
+
return {
|
|
40
|
+
sign: this.jwtSign.bind(this),
|
|
41
|
+
verify: this.jwtVerify.bind(this),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async jweKit(operation) {
|
|
45
|
+
const kryptos = await this.kryptosEnc(operation);
|
|
46
|
+
return new JweKit_1.JweKit({
|
|
47
|
+
encryption: this.encryption,
|
|
48
|
+
kryptos,
|
|
49
|
+
kryptosMayOverrideEncryption: this.kryptosMayOverrideEncryption,
|
|
50
|
+
logger: this.logger,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async jweEncrypt(data, options) {
|
|
54
|
+
const jweKit = await this.jweKit("encrypt");
|
|
55
|
+
return jweKit.encrypt(data, options);
|
|
56
|
+
}
|
|
57
|
+
async jweDecrypt(jwe) {
|
|
58
|
+
const jweKit = await this.jweKit("decrypt");
|
|
59
|
+
return jweKit.decrypt(jwe);
|
|
60
|
+
}
|
|
61
|
+
async jwsKit(operation) {
|
|
62
|
+
const kryptos = await this.kryptosSig(operation);
|
|
63
|
+
return new JwsKit_1.JwsKit({ kryptos, logger: this.logger });
|
|
64
|
+
}
|
|
65
|
+
async jwsSign(data, options) {
|
|
66
|
+
const jwsKit = await this.jwsKit("sign");
|
|
67
|
+
return jwsKit.sign(data, options);
|
|
68
|
+
}
|
|
69
|
+
async jwsVerify(jws) {
|
|
70
|
+
const jwsKit = await this.jwsKit("verify");
|
|
71
|
+
return jwsKit.verify(jws);
|
|
72
|
+
}
|
|
73
|
+
async jwtKit(operation) {
|
|
74
|
+
const kryptos = await this.kryptosSig(operation);
|
|
75
|
+
return new JwtKit_1.JwtKit({
|
|
76
|
+
clockTolerance: this.clockTolerance,
|
|
77
|
+
issuer: this.issuer,
|
|
78
|
+
kryptos,
|
|
79
|
+
logger: this.logger,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async jwtSign(content, options) {
|
|
83
|
+
const jwtKit = await this.jwtKit("sign");
|
|
84
|
+
return jwtKit.sign(content, options);
|
|
85
|
+
}
|
|
86
|
+
async jwtVerify(jwt, verify) {
|
|
87
|
+
const jwtKit = await this.jwtKit("verify");
|
|
88
|
+
return jwtKit.verify(jwt, verify);
|
|
89
|
+
}
|
|
90
|
+
async kryptosEnc(operation) {
|
|
91
|
+
const kryptos = await this.vault.find({
|
|
92
|
+
algorithm: this.encAlgorithm,
|
|
93
|
+
issuer: this.issuer,
|
|
94
|
+
operation,
|
|
95
|
+
use: "enc",
|
|
96
|
+
});
|
|
97
|
+
this.logger.silly("Kryptos found", { kryptos: kryptos.toJSON() });
|
|
98
|
+
return kryptos;
|
|
99
|
+
}
|
|
100
|
+
async kryptosSig(operation) {
|
|
101
|
+
const kryptos = await this.vault.find({
|
|
102
|
+
algorithm: this.sigAlgorithm,
|
|
103
|
+
issuer: this.issuer,
|
|
104
|
+
operation,
|
|
105
|
+
private: true,
|
|
106
|
+
use: "sig",
|
|
107
|
+
});
|
|
108
|
+
this.logger.silly("Kryptos found", { kryptos: kryptos.toJSON() });
|
|
109
|
+
return kryptos;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.Aegis = Aegis;
|
|
113
|
+
//# sourceMappingURL=Aegis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Aegis.js","sourceRoot":"","sources":["../../src/classes/Aegis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { IKryptos } from "@lindorm/kryptos";
|
|
2
|
+
import { AegisVaultOptions, AegisVaultQuery, IAegisVault, VaultConfig } from "../types";
|
|
3
|
+
export declare class AegisVault implements IAegisVault {
|
|
4
|
+
private readonly _conduit;
|
|
5
|
+
private readonly _config;
|
|
6
|
+
private readonly _external;
|
|
7
|
+
private readonly _logger;
|
|
8
|
+
private _vault;
|
|
9
|
+
constructor(options: AegisVaultOptions);
|
|
10
|
+
get config(): Array<VaultConfig>;
|
|
11
|
+
get vault(): Array<IKryptos>;
|
|
12
|
+
setup(): Promise<void>;
|
|
13
|
+
refresh(): Promise<void>;
|
|
14
|
+
add(kryptos: Array<IKryptos> | IKryptos): void;
|
|
15
|
+
find(query: AegisVaultQuery): Promise<IKryptos>;
|
|
16
|
+
filter(query: AegisVaultQuery): Promise<Array<IKryptos>>;
|
|
17
|
+
private addExternalConfig;
|
|
18
|
+
private filteredKeys;
|
|
19
|
+
private getJwks;
|
|
20
|
+
private issuerConfig;
|
|
21
|
+
private loadExternalConfig;
|
|
22
|
+
private refreshExternal;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=AegisVault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AegisVault.d.ts","sourceRoot":"","sources":["../../src/classes/AegisVault.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAW,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,WAAW,EAGX,WAAW,EAEZ,MAAM,UAAU,CAAC;AAElB,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,OAAO,CAAC,MAAM,CAAkB;gBAEb,OAAO,EAAE,iBAAiB;IAmB7C,IAAW,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAEtC;IAED,IAAW,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,CAElC;IAIY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,IAAI;IAoBxC,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAO/C,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAgBvD,iBAAiB;IAmB/B,OAAO,CAAC,YAAY;YAoBN,OAAO;YAyBP,YAAY;YAcZ,kBAAkB;YAQlB,eAAe;CAK9B"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AegisVault = void 0;
|
|
4
|
+
const conduit_1 = require("@lindorm/conduit");
|
|
5
|
+
const is_1 = require("@lindorm/is");
|
|
6
|
+
const kryptos_1 = require("@lindorm/kryptos");
|
|
7
|
+
const errors_1 = require("../errors");
|
|
8
|
+
class AegisVault {
|
|
9
|
+
_conduit;
|
|
10
|
+
_config;
|
|
11
|
+
_external;
|
|
12
|
+
_logger;
|
|
13
|
+
_vault;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this._logger = options.logger.child(["AegisVault"]);
|
|
16
|
+
this._conduit = new conduit_1.Conduit({
|
|
17
|
+
alias: "AegisVault",
|
|
18
|
+
logger: this._logger,
|
|
19
|
+
middleware: [(0, conduit_1.conduitChangeResponseDataMiddleware)()],
|
|
20
|
+
retryOptions: {
|
|
21
|
+
maxAttempts: 10,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
this._external = options.external ?? [];
|
|
25
|
+
this._config = [];
|
|
26
|
+
this._vault = [];
|
|
27
|
+
}
|
|
28
|
+
get config() {
|
|
29
|
+
return this._config;
|
|
30
|
+
}
|
|
31
|
+
get vault() {
|
|
32
|
+
return this._vault;
|
|
33
|
+
}
|
|
34
|
+
async setup() {
|
|
35
|
+
await this.loadExternalConfig();
|
|
36
|
+
await this.refresh();
|
|
37
|
+
}
|
|
38
|
+
async refresh() {
|
|
39
|
+
this._logger.verbose("Refreshing vault");
|
|
40
|
+
for (const config of this._config) {
|
|
41
|
+
await this.refreshExternal(config);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
add(kryptos) {
|
|
45
|
+
const array = (0, is_1.isArray)(kryptos) ? kryptos : [kryptos];
|
|
46
|
+
for (const item of array) {
|
|
47
|
+
if (!item.id) {
|
|
48
|
+
throw new errors_1.AegisVaultError("Id is required when adding Kryptos");
|
|
49
|
+
}
|
|
50
|
+
if (!item.issuer) {
|
|
51
|
+
throw new errors_1.AegisVaultError("Issuer is required when adding Kryptos");
|
|
52
|
+
}
|
|
53
|
+
if (item.isExpired) {
|
|
54
|
+
throw new errors_1.AegisVaultError("Kryptos is expired");
|
|
55
|
+
}
|
|
56
|
+
this._vault = this._vault.filter((i) => i.id !== item.id).concat(item);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async find(query) {
|
|
60
|
+
const [key] = await this.filter(query);
|
|
61
|
+
if (key)
|
|
62
|
+
return key;
|
|
63
|
+
throw new errors_1.AegisVaultError("Kryptos not found using query");
|
|
64
|
+
}
|
|
65
|
+
async filter(query) {
|
|
66
|
+
const filtered = this.filteredKeys(query);
|
|
67
|
+
if (filtered.length)
|
|
68
|
+
return filtered;
|
|
69
|
+
if (!query.issuer) {
|
|
70
|
+
throw new errors_1.AegisVaultError("Unable to find Kryptos without issuer");
|
|
71
|
+
}
|
|
72
|
+
const config = await this.issuerConfig(query.issuer);
|
|
73
|
+
await this.refreshExternal(config);
|
|
74
|
+
return this.filteredKeys(query);
|
|
75
|
+
}
|
|
76
|
+
async addExternalConfig(options) {
|
|
77
|
+
if ((0, is_1.isUrlLike)(options.issuer) && (0, is_1.isUrlLike)(options.jwksUri)) {
|
|
78
|
+
this._config.push({ issuer: options.issuer, jwksUri: options.jwksUri });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!(0, is_1.isUrlLike)(options.openIdConfigurationUri)) {
|
|
82
|
+
throw new errors_1.AegisVaultError("Invalid issuer options");
|
|
83
|
+
}
|
|
84
|
+
const { data: { issuer, jwksUri }, } = await this._conduit.get(options.openIdConfigurationUri);
|
|
85
|
+
this._config.push({ issuer, jwksUri });
|
|
86
|
+
}
|
|
87
|
+
filteredKeys(query) {
|
|
88
|
+
return this._vault
|
|
89
|
+
.filter((i) => i.isActive)
|
|
90
|
+
.filter((i) => ((0, is_1.isString)(query.issuer) ? query.issuer === i.issuer : true))
|
|
91
|
+
.filter((i) => ((0, is_1.isString)(query.id) ? i.id === query.id : true))
|
|
92
|
+
.filter((i) => ((0, is_1.isString)(query.algorithm) ? i.algorithm === query.algorithm : true))
|
|
93
|
+
.filter((i) => ((0, is_1.isBoolean)(query.external) ? i.isExternal === query.external : true))
|
|
94
|
+
.filter((i) => (0, is_1.isString)(query.operation) && i.operations.length
|
|
95
|
+
? i.operations.includes(query.operation)
|
|
96
|
+
: true)
|
|
97
|
+
.filter((i) => ((0, is_1.isString)(query.ownerId) ? i.ownerId === query.ownerId : true))
|
|
98
|
+
.filter((i) => ((0, is_1.isBoolean)(query.private) ? i.hasPrivateKey : true))
|
|
99
|
+
.filter((i) => ((0, is_1.isBoolean)(query.public) ? i.hasPublicKey : true))
|
|
100
|
+
.filter((i) => ((0, is_1.isString)(query.type) ? i.type === query.type : true))
|
|
101
|
+
.filter((i) => ((0, is_1.isString)(query.use) ? i.use === query.use : true))
|
|
102
|
+
.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
|
|
103
|
+
}
|
|
104
|
+
async getJwks(issuer) {
|
|
105
|
+
this._logger.verbose("Finding JWKS", { issuer });
|
|
106
|
+
const config = await this.issuerConfig(issuer);
|
|
107
|
+
const { data: { keys }, } = await this._conduit.get(config.jwksUri);
|
|
108
|
+
const result = [];
|
|
109
|
+
for (const jwk of keys) {
|
|
110
|
+
const iss = jwk.iss ?? config.issuer;
|
|
111
|
+
const jku = jwk.jku ?? config.jwksUri;
|
|
112
|
+
const kryptos = kryptos_1.Kryptos.make({ ...jwk, iss, jku });
|
|
113
|
+
if (kryptos.isExpired)
|
|
114
|
+
continue;
|
|
115
|
+
result.push(kryptos);
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
async issuerConfig(issuer) {
|
|
120
|
+
if (this._external.length && !this._config.length) {
|
|
121
|
+
await this.loadExternalConfig();
|
|
122
|
+
}
|
|
123
|
+
const config = this._config.find((c) => c.issuer === issuer);
|
|
124
|
+
if (!config) {
|
|
125
|
+
throw new errors_1.AegisVaultError("Issuer not found in config");
|
|
126
|
+
}
|
|
127
|
+
return config;
|
|
128
|
+
}
|
|
129
|
+
async loadExternalConfig() {
|
|
130
|
+
this._logger.verbose("Loading external config");
|
|
131
|
+
for (const options of this._external) {
|
|
132
|
+
await this.addExternalConfig(options);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async refreshExternal(config) {
|
|
136
|
+
const keys = await this.getJwks(config.issuer);
|
|
137
|
+
this._vault = this._vault.filter((i) => i.issuer !== config.issuer).concat(keys);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.AegisVault = AegisVault;
|
|
141
|
+
//# sourceMappingURL=AegisVault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AegisVault.js","sourceRoot":"","sources":["../../src/classes/AegisVault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DecodedJwe, DecryptedJwe, EncryptedJwe, IJweKit, JweEncryptOptions, JweKitOptions } from "../types";
|
|
2
|
+
export declare class JweKit implements IJweKit {
|
|
3
|
+
private readonly encryption;
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private readonly kryptos;
|
|
6
|
+
private readonly kryptosMayOverrideEncryption;
|
|
7
|
+
constructor(options: JweKitOptions);
|
|
8
|
+
encrypt(data: string, options?: JweEncryptOptions): EncryptedJwe;
|
|
9
|
+
decrypt(jwe: string): DecryptedJwe;
|
|
10
|
+
static decode(jwe: string): DecodedJwe;
|
|
11
|
+
private contentType;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=JweKit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JweKit.d.ts","sourceRoot":"","sources":["../../src/classes/JweKit.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,UAAU,EACV,YAAY,EAEZ,YAAY,EACZ,OAAO,EACP,iBAAiB,EACjB,aAAa,EAEd,MAAM,UAAU,CAAC;AAOlB,qBAAa,MAAO,YAAW,OAAO;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAU;gBAEpC,OAAO,EAAE,aAAa;IAQlC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,YAAY;IAqEpE,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;WA4E3B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAiB7C,OAAO,CAAC,WAAW;CASpB"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JweKit = void 0;
|
|
4
|
+
const aes_1 = require("@lindorm/aes");
|
|
5
|
+
const b64_1 = require("@lindorm/b64");
|
|
6
|
+
const utils_1 = require("@lindorm/utils");
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
const errors_1 = require("../errors");
|
|
9
|
+
const token_header_1 = require("../utils/private/token-header");
|
|
10
|
+
class JweKit {
|
|
11
|
+
encryption;
|
|
12
|
+
logger;
|
|
13
|
+
kryptos;
|
|
14
|
+
kryptosMayOverrideEncryption;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.logger = options.logger.child(["JweKit"]);
|
|
17
|
+
this.kryptos = options.kryptos;
|
|
18
|
+
this.encryption = options.encryption = "A256GCM";
|
|
19
|
+
this.kryptosMayOverrideEncryption = options.kryptosMayOverrideEncryption ?? false;
|
|
20
|
+
}
|
|
21
|
+
encrypt(data, options = {}) {
|
|
22
|
+
const encryption = this.kryptosMayOverrideEncryption && this.kryptos.encryption
|
|
23
|
+
? this.kryptos.encryption
|
|
24
|
+
: this.encryption;
|
|
25
|
+
const aes = new aes_1.AesKit({
|
|
26
|
+
encryption,
|
|
27
|
+
format: "base64url",
|
|
28
|
+
kryptos: this.kryptos,
|
|
29
|
+
});
|
|
30
|
+
const { authTag, content, hkdfSalt, initialisationVector, pbkdfIterations, pbkdfSalt, publicEncryptionJwk, publicEncryptionKey, } = aes.encrypt(data, "object");
|
|
31
|
+
const jwksUri = this.kryptos.jwksUri;
|
|
32
|
+
const keyId = this.kryptos.id;
|
|
33
|
+
const objectId = options.objectId ?? (0, crypto_1.randomUUID)();
|
|
34
|
+
const critical = [
|
|
35
|
+
"algorithm",
|
|
36
|
+
"encryption",
|
|
37
|
+
];
|
|
38
|
+
if (publicEncryptionJwk)
|
|
39
|
+
critical.push("publicEncryptionJwk");
|
|
40
|
+
if (hkdfSalt)
|
|
41
|
+
critical.push("hkdfSalt");
|
|
42
|
+
if (pbkdfIterations)
|
|
43
|
+
critical.push("pbkdfIterations");
|
|
44
|
+
if (pbkdfSalt)
|
|
45
|
+
critical.push("pbkdfSalt");
|
|
46
|
+
const headerOptions = {
|
|
47
|
+
algorithm: this.kryptos.algorithm,
|
|
48
|
+
contentType: this.contentType(data),
|
|
49
|
+
critical,
|
|
50
|
+
encryption,
|
|
51
|
+
headerType: "JWE",
|
|
52
|
+
hkdfSalt: hkdfSalt ? b64_1.B64.encode(hkdfSalt, "base64url") : undefined,
|
|
53
|
+
jwksUri,
|
|
54
|
+
keyId,
|
|
55
|
+
objectId,
|
|
56
|
+
pbkdfIterations,
|
|
57
|
+
pbkdfSalt: pbkdfSalt ? b64_1.B64.encode(pbkdfSalt, "base64url") : undefined,
|
|
58
|
+
publicEncryptionJwk,
|
|
59
|
+
};
|
|
60
|
+
const header = (0, token_header_1._encodeTokenHeader)(headerOptions);
|
|
61
|
+
this.logger.silly("Token header encoded", { header, options: headerOptions });
|
|
62
|
+
const token = (0, utils_1.removeUndefined)([
|
|
63
|
+
header,
|
|
64
|
+
publicEncryptionKey ? b64_1.B64.encode(publicEncryptionKey, "base64url") : "",
|
|
65
|
+
b64_1.B64.encode(initialisationVector, "base64url"),
|
|
66
|
+
b64_1.B64.encode(content, "base64url"),
|
|
67
|
+
authTag ? b64_1.B64.encode(authTag, "base64url") : undefined,
|
|
68
|
+
]).join(".");
|
|
69
|
+
this.logger.silly("Token created", { keyId, token });
|
|
70
|
+
return { token };
|
|
71
|
+
}
|
|
72
|
+
decrypt(jwe) {
|
|
73
|
+
const encryption = this.kryptosMayOverrideEncryption && this.kryptos.encryption
|
|
74
|
+
? this.kryptos.encryption
|
|
75
|
+
: this.encryption;
|
|
76
|
+
const decoded = JweKit.decode(jwe);
|
|
77
|
+
if (decoded.header.typ !== "JWE") {
|
|
78
|
+
throw new errors_1.JweError("Invalid token", {
|
|
79
|
+
data: { typ: decoded.header.typ },
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (this.kryptos.algorithm !== decoded.header.alg) {
|
|
83
|
+
throw new errors_1.JweError("Invalid token", {
|
|
84
|
+
data: { alg: decoded.header.alg },
|
|
85
|
+
debug: { expected: this.kryptos.algorithm },
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const header = (0, token_header_1._parseTokenHeader)(decoded.header);
|
|
89
|
+
const aes = new aes_1.AesKit({
|
|
90
|
+
encryption,
|
|
91
|
+
format: "base64url",
|
|
92
|
+
kryptos: this.kryptos,
|
|
93
|
+
});
|
|
94
|
+
const authTag = decoded.authTag ? b64_1.B64.toBuffer(decoded.authTag) : undefined;
|
|
95
|
+
const content = b64_1.B64.toBuffer(decoded.content);
|
|
96
|
+
const hkdfSalt = header.hkdfSalt
|
|
97
|
+
? b64_1.B64.toBuffer(header.hkdfSalt, "base64url")
|
|
98
|
+
: undefined;
|
|
99
|
+
const initialisationVector = b64_1.B64.toBuffer(decoded.initialisationVector);
|
|
100
|
+
const pbkdfIterations = header.pbkdfIterations;
|
|
101
|
+
const pbkdfSalt = header.pbkdfSalt
|
|
102
|
+
? b64_1.B64.toBuffer(header.pbkdfSalt, "base64url")
|
|
103
|
+
: undefined;
|
|
104
|
+
const publicEncryptionKey = decoded.publicEncryptionKey
|
|
105
|
+
? b64_1.B64.toBuffer(decoded.publicEncryptionKey)
|
|
106
|
+
: undefined;
|
|
107
|
+
const publicEncryptionJwk = header.publicEncryptionJwk;
|
|
108
|
+
if (header.critical.includes("publicEncryptionJwk") && !publicEncryptionJwk) {
|
|
109
|
+
throw new errors_1.JweError("Missing public encryption JWK");
|
|
110
|
+
}
|
|
111
|
+
if (header.critical.includes("hkdfSalt") && !hkdfSalt) {
|
|
112
|
+
throw new errors_1.JweError("Missing salt");
|
|
113
|
+
}
|
|
114
|
+
if (header.critical.includes("pbkdfIterations") && !pbkdfIterations) {
|
|
115
|
+
throw new errors_1.JweError("Missing iterations");
|
|
116
|
+
}
|
|
117
|
+
if (header.critical.includes("pbkdfSalt") && !pbkdfSalt) {
|
|
118
|
+
throw new errors_1.JweError("Missing salt");
|
|
119
|
+
}
|
|
120
|
+
const payload = aes.decrypt({
|
|
121
|
+
authTag,
|
|
122
|
+
content,
|
|
123
|
+
encryption,
|
|
124
|
+
hkdfSalt,
|
|
125
|
+
initialisationVector,
|
|
126
|
+
pbkdfIterations,
|
|
127
|
+
pbkdfSalt,
|
|
128
|
+
publicEncryptionJwk,
|
|
129
|
+
publicEncryptionKey,
|
|
130
|
+
});
|
|
131
|
+
this.logger.silly("Token decrypted", { payload });
|
|
132
|
+
return { __jwe: decoded, header, payload };
|
|
133
|
+
}
|
|
134
|
+
static decode(jwe) {
|
|
135
|
+
const [header, publicEncryptionKey, initialisationVector, content, authTag] = jwe.split(".");
|
|
136
|
+
const result = {
|
|
137
|
+
header: (0, token_header_1._decodeTokenHeader)(header),
|
|
138
|
+
publicEncryptionKey: publicEncryptionKey?.length ? publicEncryptionKey : undefined,
|
|
139
|
+
initialisationVector,
|
|
140
|
+
content,
|
|
141
|
+
authTag: authTag?.length ? authTag : undefined,
|
|
142
|
+
};
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
contentType(input) {
|
|
146
|
+
if (!input.startsWith("eyJ") && !input.includes(".")) {
|
|
147
|
+
return "text/plain";
|
|
148
|
+
}
|
|
149
|
+
const [header] = input.split(".");
|
|
150
|
+
return (0, token_header_1._decodeTokenHeader)(header).typ;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
exports.JweKit = JweKit;
|
|
154
|
+
//# sourceMappingURL=JweKit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JweKit.js","sourceRoot":"","sources":["../../src/classes/JweKit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { DecodedJws, IJwsKit, JwsKitOptions, SignJwsOptions, SignedJws, VerifiedJws } from "../types";
|
|
3
|
+
export declare class JwsKit implements IJwsKit {
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private readonly kryptos;
|
|
6
|
+
constructor(options: JwsKitOptions);
|
|
7
|
+
sign<T extends Buffer | string>(data: T, options?: SignJwsOptions): SignedJws;
|
|
8
|
+
verify<T extends Buffer | string>(jws: string): VerifiedJws<T>;
|
|
9
|
+
static decode(jws: string): DecodedJws;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=JwsKit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JwsKit.d.ts","sourceRoot":"","sources":["../../src/classes/JwsKit.ts"],"names":[],"mappings":";AAMA,OAAO,EACL,UAAU,EACV,OAAO,EACP,aAAa,EACb,cAAc,EACd,SAAS,EAET,WAAW,EAEZ,MAAM,UAAU,CAAC;AASlB,qBAAa,MAAO,YAAW,OAAO;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;gBAEhB,OAAO,EAAE,aAAa;IAKlC,IAAI,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EACnC,IAAI,EAAE,CAAC,EACP,OAAO,GAAE,cAAmB,GAC3B,SAAS;IAiDL,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;WAwCvD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;CAY9C"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JwsKit = void 0;
|
|
4
|
+
const b64_1 = require("@lindorm/b64");
|
|
5
|
+
const is_1 = require("@lindorm/is");
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const errors_1 = require("../errors");
|
|
8
|
+
const create_token_signature_1 = require("../utils/private/create-token-signature");
|
|
9
|
+
const token_header_1 = require("../utils/private/token-header");
|
|
10
|
+
const verify_token_signature_1 = require("../utils/private/verify-token-signature");
|
|
11
|
+
class JwsKit {
|
|
12
|
+
logger;
|
|
13
|
+
kryptos;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.logger = options.logger.child(["JwsKit"]);
|
|
16
|
+
this.kryptos = options.kryptos;
|
|
17
|
+
}
|
|
18
|
+
sign(data, options = {}) {
|
|
19
|
+
const algorithm = this.kryptos.algorithm;
|
|
20
|
+
const jwksUri = this.kryptos.jwksUri;
|
|
21
|
+
const keyId = this.kryptos.id;
|
|
22
|
+
const objectId = options.objectId ?? (0, crypto_1.randomUUID)();
|
|
23
|
+
const contentType = options.contentType
|
|
24
|
+
? options.contentType
|
|
25
|
+
: (0, is_1.isString)(data)
|
|
26
|
+
? "text/plain"
|
|
27
|
+
: "application/buffer";
|
|
28
|
+
const headerOptions = {
|
|
29
|
+
algorithm,
|
|
30
|
+
contentType,
|
|
31
|
+
headerType: "JWS",
|
|
32
|
+
jwksUri,
|
|
33
|
+
keyId,
|
|
34
|
+
objectId,
|
|
35
|
+
};
|
|
36
|
+
const header = (0, token_header_1._encodeTokenHeader)(headerOptions);
|
|
37
|
+
this.logger.silly("Token header encoded", { header, options: headerOptions });
|
|
38
|
+
const payload = (0, is_1.isBuffer)(data)
|
|
39
|
+
? data.toString("base64url")
|
|
40
|
+
: b64_1.B64.encode(data, "base64url");
|
|
41
|
+
this.logger.silly("Token payload encoded", { payload, options });
|
|
42
|
+
const signature = (0, create_token_signature_1._createTokenSignature)({
|
|
43
|
+
header,
|
|
44
|
+
payload,
|
|
45
|
+
kryptos: this.kryptos,
|
|
46
|
+
});
|
|
47
|
+
this.logger.silly("Token signature created", { signature });
|
|
48
|
+
const token = `${header}.${payload}.${signature}`;
|
|
49
|
+
this.logger.silly("Token signed", {
|
|
50
|
+
keyId,
|
|
51
|
+
objectId,
|
|
52
|
+
token,
|
|
53
|
+
});
|
|
54
|
+
return { objectId, token };
|
|
55
|
+
}
|
|
56
|
+
verify(jws) {
|
|
57
|
+
const decoded = JwsKit.decode(jws);
|
|
58
|
+
if (decoded.header.typ !== "JWS") {
|
|
59
|
+
throw new errors_1.JwsError("Invalid token", {
|
|
60
|
+
data: { typ: decoded.header.typ },
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (this.kryptos.algorithm !== decoded.header.alg) {
|
|
64
|
+
throw new errors_1.JwsError("Invalid token", {
|
|
65
|
+
data: { alg: decoded.header.alg },
|
|
66
|
+
debug: { expected: this.kryptos.algorithm },
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const verified = (0, verify_token_signature_1._verifyTokenSignature)(this.kryptos, jws);
|
|
70
|
+
this.logger.silly("Token signature verified", { verified, token: jws });
|
|
71
|
+
if (!verified) {
|
|
72
|
+
throw new errors_1.JwsError("Invalid token", {
|
|
73
|
+
data: { verified, token: jws },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const header = (0, token_header_1._parseTokenHeader)(decoded.header);
|
|
77
|
+
const payload = header.contentType === "text/plain"
|
|
78
|
+
? decoded.payload
|
|
79
|
+
: b64_1.B64.toBuffer(decoded.payload, "base64url");
|
|
80
|
+
this.logger.silly("Token verified", { header, payload });
|
|
81
|
+
return { __jws: decoded, header, payload: payload };
|
|
82
|
+
}
|
|
83
|
+
static decode(jws) {
|
|
84
|
+
const [header, payload, signature] = jws.split(".");
|
|
85
|
+
const decodedHeader = (0, token_header_1._decodeTokenHeader)(header);
|
|
86
|
+
const result = {
|
|
87
|
+
header: decodedHeader,
|
|
88
|
+
payload: decodedHeader.cty === "text/plain" ? b64_1.B64.toString(payload) : payload,
|
|
89
|
+
signature,
|
|
90
|
+
};
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.JwsKit = JwsKit;
|
|
95
|
+
//# sourceMappingURL=JwsKit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JwsKit.js","sourceRoot":"","sources":["../../src/classes/JwsKit.ts"],"names":[],"mappings":"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"}
|