@schemavaults/jwt 0.6.13

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.
Files changed (112) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +3 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/jwt/aud.d.ts +1 -0
  5. package/dist/jwt/aud.js +3 -0
  6. package/dist/jwt/aud.js.map +1 -0
  7. package/dist/jwt/decode.d.ts +22 -0
  8. package/dist/jwt/decode.js +228 -0
  9. package/dist/jwt/decode.js.map +1 -0
  10. package/dist/jwt/encrypt_decrypt_alg.d.ts +3 -0
  11. package/dist/jwt/encrypt_decrypt_alg.js +4 -0
  12. package/dist/jwt/encrypt_decrypt_alg.js.map +1 -0
  13. package/dist/jwt/expiry.d.ts +1 -0
  14. package/dist/jwt/expiry.js +2 -0
  15. package/dist/jwt/expiry.js.map +1 -0
  16. package/dist/jwt/generate.d.ts +31 -0
  17. package/dist/jwt/generate.js +188 -0
  18. package/dist/jwt/generate.js.map +1 -0
  19. package/dist/jwt/get_audience_from_token.d.ts +1 -0
  20. package/dist/jwt/get_audience_from_token.js +17 -0
  21. package/dist/jwt/get_audience_from_token.js.map +1 -0
  22. package/dist/jwt/get_keyset_id_from_token.d.ts +2 -0
  23. package/dist/jwt/get_keyset_id_from_token.js +17 -0
  24. package/dist/jwt/get_keyset_id_from_token.js.map +1 -0
  25. package/dist/jwt/index.d.ts +9 -0
  26. package/dist/jwt/index.js +9 -0
  27. package/dist/jwt/index.js.map +1 -0
  28. package/dist/jwt/iss.d.ts +1 -0
  29. package/dist/jwt/iss.js +3 -0
  30. package/dist/jwt/iss.js.map +1 -0
  31. package/dist/jwt/jwt-factory.d.ts +34 -0
  32. package/dist/jwt/jwt-factory.js +147 -0
  33. package/dist/jwt/jwt-factory.js.map +1 -0
  34. package/dist/jwt/jwt_keys/AbstractBaseKeyPairFactory.d.ts +11 -0
  35. package/dist/jwt/jwt_keys/AbstractBaseKeyPairFactory.js +26 -0
  36. package/dist/jwt/jwt_keys/AbstractBaseKeyPairFactory.js.map +1 -0
  37. package/dist/jwt/jwt_keys/ContentEncryptionKeyPairFactory.d.ts +14 -0
  38. package/dist/jwt/jwt_keys/ContentEncryptionKeyPairFactory.js +45 -0
  39. package/dist/jwt/jwt_keys/ContentEncryptionKeyPairFactory.js.map +1 -0
  40. package/dist/jwt/jwt_keys/I_JWT_Keys.d.ts +15 -0
  41. package/dist/jwt/jwt_keys/I_JWT_Keys.js +2 -0
  42. package/dist/jwt/jwt_keys/I_JWT_Keys.js.map +1 -0
  43. package/dist/jwt/jwt_keys/JWK.d.ts +2 -0
  44. package/dist/jwt/jwt_keys/JWK.js +2 -0
  45. package/dist/jwt/jwt_keys/JWK.js.map +1 -0
  46. package/dist/jwt/jwt_keys/JWKS.d.ts +4 -0
  47. package/dist/jwt/jwt_keys/JWKS.js +2 -0
  48. package/dist/jwt/jwt_keys/JWKS.js.map +1 -0
  49. package/dist/jwt/jwt_keys/JsonSerializedJwtKey.d.ts +43 -0
  50. package/dist/jwt/jwt_keys/JsonSerializedJwtKey.js +38 -0
  51. package/dist/jwt/jwt_keys/JsonSerializedJwtKey.js.map +1 -0
  52. package/dist/jwt/jwt_keys/SigningKeyPairFactory.d.ts +14 -0
  53. package/dist/jwt/jwt_keys/SigningKeyPairFactory.js +46 -0
  54. package/dist/jwt/jwt_keys/SigningKeyPairFactory.js.map +1 -0
  55. package/dist/jwt/jwt_keys/ValidJwtKeyTypes.d.ts +4 -0
  56. package/dist/jwt/jwt_keys/ValidJwtKeyTypes.js +7 -0
  57. package/dist/jwt/jwt_keys/ValidJwtKeyTypes.js.map +1 -0
  58. package/dist/jwt/jwt_keys/generate_new_jwt_keyset.d.ts +21 -0
  59. package/dist/jwt/jwt_keys/generate_new_jwt_keyset.js +110 -0
  60. package/dist/jwt/jwt_keys/generate_new_jwt_keyset.js.map +1 -0
  61. package/dist/jwt/jwt_keys/getAlgorithmForKey.d.ts +2 -0
  62. package/dist/jwt/jwt_keys/getAlgorithmForKey.js +14 -0
  63. package/dist/jwt/jwt_keys/getAlgorithmForKey.js.map +1 -0
  64. package/dist/jwt/jwt_keys/importAsymmetricJWK.d.ts +3 -0
  65. package/dist/jwt/jwt_keys/importAsymmetricJWK.js +15 -0
  66. package/dist/jwt/jwt_keys/importAsymmetricJWK.js.map +1 -0
  67. package/dist/jwt/jwt_keys/index.d.ts +13 -0
  68. package/dist/jwt/jwt_keys/index.js +12 -0
  69. package/dist/jwt/jwt_keys/index.js.map +1 -0
  70. package/dist/jwt/jwt_keys/jwt_keys.d.ts +33 -0
  71. package/dist/jwt/jwt_keys/jwt_keys.js +96 -0
  72. package/dist/jwt/jwt_keys/jwt_keys.js.map +1 -0
  73. package/dist/jwt/jwt_keys/pem-format.d.ts +17 -0
  74. package/dist/jwt/jwt_keys/pem-format.js +69 -0
  75. package/dist/jwt/jwt_keys/pem-format.js.map +1 -0
  76. package/dist/jwt/jwt_keys/raw_jwt_keys_store.d.ts +38 -0
  77. package/dist/jwt/jwt_keys/raw_jwt_keys_store.js +191 -0
  78. package/dist/jwt/jwt_keys/raw_jwt_keys_store.js.map +1 -0
  79. package/dist/jwt/jwt_keys/to_public_jwks.d.ts +6 -0
  80. package/dist/jwt/jwt_keys/to_public_jwks.js +39 -0
  81. package/dist/jwt/jwt_keys/to_public_jwks.js.map +1 -0
  82. package/dist/jwt/payload_data.d.ts +73 -0
  83. package/dist/jwt/payload_data.js +45 -0
  84. package/dist/jwt/payload_data.js.map +1 -0
  85. package/dist/jwt/sign.d.ts +23 -0
  86. package/dist/jwt/sign.js +68 -0
  87. package/dist/jwt/sign.js.map +1 -0
  88. package/dist/jwt/sign_verify_alg.d.ts +2 -0
  89. package/dist/jwt/sign_verify_alg.js +3 -0
  90. package/dist/jwt/sign_verify_alg.js.map +1 -0
  91. package/dist/jwt/verify_signature.d.ts +23 -0
  92. package/dist/jwt/verify_signature.js +86 -0
  93. package/dist/jwt/verify_signature.js.map +1 -0
  94. package/dist/utils/fromBase64UrlEncoded.d.ts +2 -0
  95. package/dist/utils/fromBase64UrlEncoded.js +5 -0
  96. package/dist/utils/fromBase64UrlEncoded.js.map +1 -0
  97. package/dist/utils/getDefaultDebugState.d.ts +2 -0
  98. package/dist/utils/getDefaultDebugState.js +7 -0
  99. package/dist/utils/getDefaultDebugState.js.map +1 -0
  100. package/dist/utils/isValidBase64UrlEncoding.d.ts +2 -0
  101. package/dist/utils/isValidBase64UrlEncoding.js +18 -0
  102. package/dist/utils/isValidBase64UrlEncoding.js.map +1 -0
  103. package/dist/utils/isValidUuid.d.ts +2 -0
  104. package/dist/utils/isValidUuid.js +4 -0
  105. package/dist/utils/isValidUuid.js.map +1 -0
  106. package/dist/utils/maybeStripQuotes.d.ts +8 -0
  107. package/dist/utils/maybeStripQuotes.js +20 -0
  108. package/dist/utils/maybeStripQuotes.js.map +1 -0
  109. package/dist/utils/toBase64UrlEncoded.d.ts +2 -0
  110. package/dist/utils/toBase64UrlEncoded.js +5 -0
  111. package/dist/utils/toBase64UrlEncoded.js.map +1 -0
  112. package/package.json +48 -0
@@ -0,0 +1,110 @@
1
+ import { apiServerIdSchema } from "@schemavaults/app-definitions";
2
+ import ContentEncryptionKeyPairFactory from "./ContentEncryptionKeyPairFactory";
3
+ import JWT_Keys from "./jwt_keys";
4
+ import SigningKeyPairFactory from "./SigningKeyPairFactory";
5
+ import isValidUuid from "../../utils/isValidUuid";
6
+ /**
7
+ * @name generateJwtSigningKeyPair
8
+ * @param debug Enable additional debug logging
9
+ * @returns A PKCS8 and SPKI formatted RS256 key pair
10
+ */
11
+ export async function generateJwtSigningKeyPair(debug = false) {
12
+ const signing_key_pair_factory = new SigningKeyPairFactory({ debug });
13
+ const [privateKey, publicKey] = await signing_key_pair_factory.generate("pem");
14
+ return [privateKey, publicKey];
15
+ }
16
+ /**
17
+ * @name generateJwtContentEncryptionKeyPair()
18
+ * @param debug Enable additional debug logging
19
+ * @returns 256-bit base64url-encoded content encryption key (string)
20
+ */
21
+ export async function generateJwtContentEncryptionKeyPair(debug = false) {
22
+ const cek_key_pair_factory = new ContentEncryptionKeyPairFactory({ debug });
23
+ const [privateKey, publicKey] = await cek_key_pair_factory.generate("pem");
24
+ if (debug) {
25
+ console.log("[JWT_Keys] Generated encryption/decryption key pair: ", [
26
+ privateKey,
27
+ publicKey,
28
+ ]);
29
+ }
30
+ return [privateKey, publicKey];
31
+ }
32
+ const DEFAULT_KEYSET_VALID_DURATION = 1000 * 60 * 60 * 24 * 30; // 30 days
33
+ export async function generateNewJwtKeySet(opts) {
34
+ if (!opts || typeof opts !== "object") {
35
+ throw new TypeError("Expected first argument to be an object of type IGenerateNewJwtKeySetOpts");
36
+ }
37
+ const debug = opts?.debug || false;
38
+ const audience_id = opts.audience_id;
39
+ if (typeof audience_id !== "string") {
40
+ throw new TypeError(`Invalid audience ID: '${audience_id}'. Should be a string.`);
41
+ }
42
+ else if (!apiServerIdSchema.safeParse(audience_id).success) {
43
+ throw new TypeError(`Invalid audience ID: '${audience_id}'. Should be a valid API server ID.`);
44
+ }
45
+ if (typeof opts?.keyset_id === "string") {
46
+ if (!isValidUuid(opts.keyset_id)) {
47
+ throw new TypeError(`Invalid keyset ID: '${opts.keyset_id}'. Should be a valid UUID, if provided.`);
48
+ }
49
+ }
50
+ else {
51
+ opts.keyset_id = undefined;
52
+ }
53
+ const [[privateEncryptDecryptKey, publicEncryptDecryptKey], [privateSigningKey, publicSigningVerifierKey],] = await Promise.all([
54
+ generateJwtContentEncryptionKeyPair(debug),
55
+ generateJwtSigningKeyPair(debug),
56
+ ]);
57
+ const keyset_id = typeof opts?.keyset_id === "string" ? opts.keyset_id : crypto.randomUUID();
58
+ const keyset_expiry = typeof opts?.keyset_expiry === "number"
59
+ ? opts.keyset_expiry
60
+ : Date.now() + DEFAULT_KEYSET_VALID_DURATION;
61
+ if (keyset_expiry < Date.now()) {
62
+ throw new Error(`Invalid keyset expiry: '${keyset_expiry}'. Should be a future timestamp.`);
63
+ }
64
+ const generatedKeys = new JWT_Keys({
65
+ audience_id,
66
+ keyset_id,
67
+ keyset_expiry,
68
+ encryption: {
69
+ // encryption happens with public key
70
+ format: "pem",
71
+ privacy_level: "public",
72
+ value: publicEncryptDecryptKey,
73
+ key_type: "encryption",
74
+ keyset_id,
75
+ audience_id,
76
+ },
77
+ decryption: {
78
+ // decryption happens with private key (counter-intuitively)
79
+ value: privateEncryptDecryptKey,
80
+ privacy_level: "private",
81
+ format: "pem",
82
+ key_type: "decryption",
83
+ keyset_id,
84
+ audience_id,
85
+ },
86
+ signing: {
87
+ value: privateSigningKey,
88
+ privacy_level: "private",
89
+ format: "pem",
90
+ key_type: "signing",
91
+ keyset_id,
92
+ audience_id,
93
+ },
94
+ verification: {
95
+ value: publicSigningVerifierKey,
96
+ privacy_level: "public",
97
+ format: "pem",
98
+ key_type: "verification",
99
+ keyset_id,
100
+ audience_id,
101
+ },
102
+ is_auth_server: true,
103
+ });
104
+ if (debug) {
105
+ console.log("generateNewJwtKeySet() -> ", generatedKeys);
106
+ }
107
+ return generatedKeys;
108
+ }
109
+ export default generateNewJwtKeySet;
110
+ //# sourceMappingURL=generate_new_jwt_keyset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate_new_jwt_keyset.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/generate_new_jwt_keyset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { JsonSerializedJwtKey } from "./JsonSerializedJwtKey";
2
+ export default function getAlgorithmForKey(key: JsonSerializedJwtKey): string;
@@ -0,0 +1,14 @@
1
+ import encryptDecryptAlg from "../encrypt_decrypt_alg";
2
+ import signVerifyAlg from "../sign_verify_alg";
3
+ export default function getAlgorithmForKey(key) {
4
+ if (key.key_type === "encryption" || key.key_type === "decryption") {
5
+ return encryptDecryptAlg;
6
+ }
7
+ else if (key.key_type === "signing" || key.key_type === "verification") {
8
+ return signVerifyAlg;
9
+ }
10
+ else {
11
+ throw new Error(`Unsupported key type: ${key.key_type}`);
12
+ }
13
+ }
14
+ //# sourceMappingURL=getAlgorithmForKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAlgorithmForKey.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/getAlgorithmForKey.ts"],"names":[],"mappings":"AACA,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AACvD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAE/C,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,GAAyB;IAClE,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACnE,OAAO,iBAAiB,CAAC;IAC3B,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;QACzE,OAAO,aAAa,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { JWK } from "./JWK";
2
+ export declare function importAsymmetricJWK(jwk: JWK): Promise<CryptoKey>;
3
+ export default importAsymmetricJWK;
@@ -0,0 +1,15 @@
1
+ import { importJWK as importJsonWebKey } from "jose";
2
+ export async function importAsymmetricJWK(jwk) {
3
+ if (!("alg" in jwk)) {
4
+ throw new Error("Invalid JWK: missing 'alg' property");
5
+ }
6
+ const activated_key = await importJsonWebKey(jwk);
7
+ // Symmetric JSON Web Keys (i.e. kty: "oct") yield back an Uint8Array instead of a CryptoKey.
8
+ // We're only using asymmetric keys, so we can safely ignore this case.
9
+ if (activated_key instanceof Uint8Array) {
10
+ throw new TypeError("Invalid JWK: asymmetric key expected");
11
+ }
12
+ return activated_key;
13
+ }
14
+ export default importAsymmetricJWK;
15
+ //# sourceMappingURL=importAsymmetricJWK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importAsymmetricJWK.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/importAsymmetricJWK.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAQ;IAChD,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAElD,6FAA6F;IAC7F,uEAAuE;IAEvE,IAAI,aAAa,YAAY,UAAU,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export { JWT_Keys, JWT_Keys as default } from "./jwt_keys";
2
+ export type { I_JWT_Keys } from './I_JWT_Keys';
3
+ export { jsonSerializedJwtKeySchema } from './JsonSerializedJwtKey';
4
+ export type { JsonSerializedJwtKey } from './JsonSerializedJwtKey';
5
+ export { ContentEncryptionKeyPairFactory } from './ContentEncryptionKeyPairFactory';
6
+ export { SigningKeyPairFactory } from "./SigningKeyPairFactory";
7
+ export { generateNewJwtKeySet, generateJwtContentEncryptionKeyPair, generateJwtSigningKeyPair } from './generate_new_jwt_keyset';
8
+ import { to_public_jwks } from './to_public_jwks';
9
+ export { to_public_jwks };
10
+ export type { JWK } from './JWK';
11
+ export type { JWKS } from './JWKS';
12
+ export { importAsymmetricJWK } from "./importAsymmetricJWK";
13
+ export { PEMFormat } from './pem-format';
@@ -0,0 +1,12 @@
1
+ // jwt_keys/index.ts
2
+ // JWT_Keys contains a set of keys used for JWT encryption and signing
3
+ export { JWT_Keys, JWT_Keys as default } from "./jwt_keys";
4
+ export { jsonSerializedJwtKeySchema } from './JsonSerializedJwtKey';
5
+ export { ContentEncryptionKeyPairFactory } from './ContentEncryptionKeyPairFactory';
6
+ export { SigningKeyPairFactory } from "./SigningKeyPairFactory";
7
+ export { generateNewJwtKeySet, generateJwtContentEncryptionKeyPair, generateJwtSigningKeyPair } from './generate_new_jwt_keyset';
8
+ import { to_public_jwks } from './to_public_jwks';
9
+ export { to_public_jwks };
10
+ export { importAsymmetricJWK } from "./importAsymmetricJWK";
11
+ export { PEMFormat } from './pem-format';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,sEAAsE;AAEtE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAGpE,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EACL,oBAAoB,EACpB,mCAAmC,EACnC,yBAAyB,EAC1B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,CAAC;AAI1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { type CryptoKey } from "jose";
2
+ import Raw_JWT_Keys_Store, { type IInitRawJwtKeysStoreOptions } from "./raw_jwt_keys_store";
3
+ import type { JsonSerializedJwtKey } from "./JsonSerializedJwtKey";
4
+ import type { I_JWT_Keys } from "./I_JWT_Keys";
5
+ /**
6
+ * @name JWT_Keys
7
+ * @class
8
+ * @description A class for interacting with JWT keys-- both encryption/decryption
9
+ * @constructor JWT_Keys.init(...)
10
+ * @hideconstructor
11
+ */
12
+ export declare class JWT_Keys implements I_JWT_Keys {
13
+ get audience_id(): string;
14
+ get keyset_id(): string;
15
+ get keyset_expiry(): number;
16
+ readonly raw_keys: Raw_JWT_Keys_Store;
17
+ constructor(raw_keys_or_opts: Raw_JWT_Keys_Store | IInitRawJwtKeysStoreOptions);
18
+ get signing_key(): Promise<CryptoKey> | null;
19
+ get verification_key(): Promise<CryptoKey>;
20
+ private static init_private_signing_crypto_key;
21
+ private static init_spki_public_verification_key;
22
+ private static init_decryption_key;
23
+ private static init_encryption_key;
24
+ get encryption_key(): Promise<CryptoKey> | null;
25
+ get decryption_key(): Promise<CryptoKey>;
26
+ exportKeys(): Raw_JWT_Keys_Store;
27
+ listSerializedKeys(): readonly JsonSerializedJwtKey[];
28
+ get signing_key_json(): JsonSerializedJwtKey | null;
29
+ get verification_key_json(): JsonSerializedJwtKey;
30
+ get encryption_key_json(): JsonSerializedJwtKey | null;
31
+ get decryption_key_json(): JsonSerializedJwtKey;
32
+ }
33
+ export default JWT_Keys;
@@ -0,0 +1,96 @@
1
+ import { importPKCS8, importSPKI } from "jose";
2
+ import Raw_JWT_Keys_Store from "./raw_jwt_keys_store";
3
+ import encryptDecryptAlg from "../encrypt_decrypt_alg";
4
+ import signingVerificationAlg from "../sign_verify_alg";
5
+ /**
6
+ * @name JWT_Keys
7
+ * @class
8
+ * @description A class for interacting with JWT keys-- both encryption/decryption
9
+ * @constructor JWT_Keys.init(...)
10
+ * @hideconstructor
11
+ */
12
+ export class JWT_Keys {
13
+ get audience_id() {
14
+ const audience_id = this.raw_keys.audience_id;
15
+ if (typeof audience_id !== "string") {
16
+ throw new Error("Expected 'audience_id' to be a string!");
17
+ }
18
+ return audience_id;
19
+ }
20
+ get keyset_id() {
21
+ return this.raw_keys.keyset_id;
22
+ }
23
+ get keyset_expiry() {
24
+ return this.raw_keys.keyset_expiry;
25
+ }
26
+ raw_keys;
27
+ constructor(raw_keys_or_opts) {
28
+ this.raw_keys =
29
+ raw_keys_or_opts instanceof Raw_JWT_Keys_Store
30
+ ? raw_keys_or_opts
31
+ : new Raw_JWT_Keys_Store(raw_keys_or_opts);
32
+ }
33
+ get signing_key() {
34
+ const raw_signing_key = this.raw_keys.signing;
35
+ if (!raw_signing_key) {
36
+ return null;
37
+ }
38
+ return JWT_Keys.init_private_signing_crypto_key(raw_signing_key);
39
+ }
40
+ get verification_key() {
41
+ const raw_verifier_key = this.raw_keys.verification;
42
+ return JWT_Keys.init_spki_public_verification_key(raw_verifier_key);
43
+ }
44
+ static async init_private_signing_crypto_key(pkcs8) {
45
+ return (await importPKCS8(pkcs8, signingVerificationAlg, {
46
+ extractable: true,
47
+ }));
48
+ }
49
+ static async init_spki_public_verification_key(spki) {
50
+ return await importSPKI(spki, signingVerificationAlg, {
51
+ extractable: true,
52
+ });
53
+ }
54
+ static async init_decryption_key(pkcs8) {
55
+ const initializedPkcs8EncryptionKey = await importPKCS8(pkcs8, encryptDecryptAlg, {
56
+ extractable: true,
57
+ });
58
+ return initializedPkcs8EncryptionKey;
59
+ }
60
+ static async init_encryption_key(spki) {
61
+ return await importSPKI(spki, encryptDecryptAlg, {
62
+ extractable: true,
63
+ });
64
+ }
65
+ get encryption_key() {
66
+ const raw_encryption_key = this.raw_keys.encryption;
67
+ if (!raw_encryption_key) {
68
+ return null;
69
+ }
70
+ return JWT_Keys.init_encryption_key(raw_encryption_key);
71
+ }
72
+ get decryption_key() {
73
+ const raw_decryption_key = this.raw_keys.decryption;
74
+ return JWT_Keys.init_decryption_key(raw_decryption_key);
75
+ }
76
+ exportKeys() {
77
+ return this.raw_keys;
78
+ }
79
+ listSerializedKeys() {
80
+ return this.exportKeys().listSerializedKeys();
81
+ }
82
+ get signing_key_json() {
83
+ return this.raw_keys.signing_json ?? null;
84
+ }
85
+ get verification_key_json() {
86
+ return this.raw_keys.verification_json;
87
+ }
88
+ get encryption_key_json() {
89
+ return this.raw_keys.encryption_json ?? null;
90
+ }
91
+ get decryption_key_json() {
92
+ return this.raw_keys.decryption_json;
93
+ }
94
+ }
95
+ export default JWT_Keys;
96
+ //# sourceMappingURL=jwt_keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt_keys.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/jwt_keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @name PEMFormat
3
+ * @class
4
+ * @hideconstructor
5
+ * @see PEMFormat.toPemFormat()
6
+ * @see PEMFormat.isPemFormat()
7
+ */
8
+ export declare class PEMFormat {
9
+ private constructor();
10
+ private static arrayBufferToBase64;
11
+ private static addNewLines;
12
+ private static getPemPrefix;
13
+ private static getPemSuffix;
14
+ static toPemFormat(key: ArrayBuffer, key_type: "PUBLIC" | "PRIVATE"): string;
15
+ static isPemFormat(key: string, key_type: "PUBLIC" | "PRIVATE"): boolean;
16
+ }
17
+ export default PEMFormat;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * @name PEMFormat
3
+ * @class
4
+ * @hideconstructor
5
+ * @see PEMFormat.toPemFormat()
6
+ * @see PEMFormat.isPemFormat()
7
+ */
8
+ export class PEMFormat {
9
+ constructor() { }
10
+ static arrayBufferToBase64(arrayBuffer) {
11
+ let byteArray = new Uint8Array(arrayBuffer);
12
+ let byteString = "";
13
+ for (var i = 0; i < byteArray.byteLength; i++) {
14
+ byteString += String.fromCharCode(byteArray[i]);
15
+ }
16
+ return btoa(byteString);
17
+ }
18
+ static addNewLines(base64str) {
19
+ let finalString = "";
20
+ let remainingString = base64str;
21
+ while (remainingString.length > 0) {
22
+ finalString += `${remainingString.substring(0, 64)}\n`;
23
+ remainingString = remainingString.substring(64);
24
+ }
25
+ return finalString;
26
+ }
27
+ static getPemPrefix(key_type) {
28
+ return `-----BEGIN ${key_type} KEY-----`;
29
+ }
30
+ static getPemSuffix(key_type) {
31
+ return `-----END ${key_type} KEY-----`;
32
+ }
33
+ static toPemFormat(key, key_type) {
34
+ if (key_type !== "PUBLIC" && key_type !== "PRIVATE") {
35
+ throw new Error("Expected 'key_type' to be 'PUBLIC' or 'PRIVATE'");
36
+ }
37
+ const raw_base64_key = PEMFormat.arrayBufferToBase64(key);
38
+ const with_newlines = PEMFormat.addNewLines(raw_base64_key);
39
+ const pem = `${PEMFormat.getPemPrefix(key_type)}\n` +
40
+ with_newlines +
41
+ `${PEMFormat.getPemSuffix(key_type)}`;
42
+ return pem;
43
+ }
44
+ static isPemFormat(key, key_type) {
45
+ if (key_type !== "PUBLIC" && key_type !== "PRIVATE") {
46
+ throw new Error("Expected 'key_type' to be 'PUBLIC' or 'PRIVATE'");
47
+ }
48
+ const prefix = PEMFormat.getPemPrefix(key_type);
49
+ const suffix = PEMFormat.getPemSuffix(key_type);
50
+ if (!key.startsWith(prefix)) {
51
+ console.error("[isPemFormat] key does not start with prefix: ", prefix);
52
+ return false;
53
+ }
54
+ else if (!key.endsWith(suffix)) {
55
+ console.error("[isPemFormat] key does not end with suffix: ", suffix);
56
+ return false;
57
+ }
58
+ const allLinesLessThan64Chars = key
59
+ .split("\n")
60
+ .every((line) => line.length <= 64);
61
+ if (!allLinesLessThan64Chars) {
62
+ console.error("[isPemFormat] key has line length longer than 64!");
63
+ return false;
64
+ }
65
+ return true;
66
+ }
67
+ }
68
+ export default PEMFormat;
69
+ //# sourceMappingURL=pem-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pem-format.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/pem-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type JsonSerializedJwtKey } from "./JsonSerializedJwtKey";
2
+ export interface IInitRawJwtKeysStoreOptions {
3
+ audience_id: string;
4
+ keyset_id: string;
5
+ keyset_expiry: number;
6
+ encryption?: JsonSerializedJwtKey;
7
+ decryption: JsonSerializedJwtKey;
8
+ signing?: JsonSerializedJwtKey;
9
+ verification: JsonSerializedJwtKey;
10
+ is_auth_server?: boolean;
11
+ }
12
+ declare class Raw_JWT_Keys_Store {
13
+ readonly audience_id: string;
14
+ readonly keyset_id: string;
15
+ private readonly is_auth_server;
16
+ readonly keyset_expiry: number;
17
+ private readonly _raw_encryption_key;
18
+ private readonly _raw_decryption_key;
19
+ private readonly _raw_signing_key;
20
+ private readonly _raw_verification_key;
21
+ private static parseKeyValue;
22
+ private static encodeBase64Url;
23
+ constructor({ audience_id, keyset_id, keyset_expiry, encryption, decryption, signing, verification, is_auth_server, }: IInitRawJwtKeysStoreOptions);
24
+ get encryption(): string | null;
25
+ get decryption(): string;
26
+ get signing(): string | null;
27
+ get verification(): string;
28
+ get encryption_base64url(): string | null;
29
+ get decryption_base64url(): string;
30
+ get verification_base64url(): string;
31
+ get signing_base64url(): string | null;
32
+ get encryption_json(): JsonSerializedJwtKey | null;
33
+ get decryption_json(): JsonSerializedJwtKey;
34
+ get signing_json(): JsonSerializedJwtKey | null;
35
+ get verification_json(): JsonSerializedJwtKey;
36
+ listSerializedKeys(): readonly JsonSerializedJwtKey[];
37
+ }
38
+ export default Raw_JWT_Keys_Store;
@@ -0,0 +1,191 @@
1
+ import isValidBase64UrlEncoding from "../../utils/isValidBase64UrlEncoding";
2
+ import PEMFormat from "./pem-format";
3
+ import { base64url } from "jose";
4
+ import { jsonSerializedJwtKeySchema, } from "./JsonSerializedJwtKey";
5
+ import isValidUuid from "../../utils/isValidUuid";
6
+ import { apiServerIdSchema } from "@schemavaults/app-definitions";
7
+ class Raw_JWT_Keys_Store {
8
+ audience_id;
9
+ keyset_id;
10
+ is_auth_server;
11
+ keyset_expiry;
12
+ // Keys for encryption/decryption (JWE)
13
+ _raw_encryption_key;
14
+ _raw_decryption_key;
15
+ // Keys for signing/verification (JWS)
16
+ _raw_signing_key;
17
+ _raw_verification_key;
18
+ // Parses the IKeyInitFormat into 'pem' format
19
+ static parseKeyValue(key) {
20
+ const parsed_key = jsonSerializedJwtKeySchema.safeParse(key);
21
+ if (!parsed_key.success) {
22
+ console.error("Invalid key to save within Raw_Jwt_Keys_Store:", parsed_key.error);
23
+ throw new TypeError("Invalid key to save within Raw_Jwt_Keys_Store!");
24
+ }
25
+ if (key.format === "pem") {
26
+ if (!PEMFormat.isPemFormat(key.value, key.privacy_level === "private" ? "PRIVATE" : "PUBLIC")) {
27
+ throw new TypeError("Invalid PEM format for key!");
28
+ }
29
+ return key.value;
30
+ }
31
+ else if (key.format === "base64url") {
32
+ if (!isValidBase64UrlEncoding(key.value)) {
33
+ throw new TypeError("Invalid base64url format for key!");
34
+ }
35
+ const utf8_key_value = Buffer.from(key.value, "base64url").toString("utf8");
36
+ return Raw_JWT_Keys_Store.parseKeyValue({
37
+ format: "pem",
38
+ value: utf8_key_value,
39
+ privacy_level: key.privacy_level,
40
+ key_type: key.key_type,
41
+ keyset_id: key.keyset_id,
42
+ audience_id: key.audience_id,
43
+ });
44
+ }
45
+ else {
46
+ throw new Error("Invalid key format. Expected either 'pem' or 'base64url'");
47
+ }
48
+ }
49
+ static encodeBase64Url(key) {
50
+ return base64url.encode(key);
51
+ }
52
+ constructor({ audience_id, keyset_id, keyset_expiry, encryption, decryption, signing, verification, is_auth_server, }) {
53
+ // Validate keyset ID
54
+ if (!isValidUuid(keyset_id)) {
55
+ throw new TypeError("Expected 'keyset_id' to be a valid UUID!");
56
+ }
57
+ this.keyset_id = keyset_id;
58
+ // Validate audience ID
59
+ if (typeof audience_id !== "string" ||
60
+ !apiServerIdSchema.safeParse(audience_id).success) {
61
+ throw new TypeError("Expected 'audience_id' to be a valid API server ID!");
62
+ }
63
+ this.audience_id = audience_id;
64
+ if (typeof keyset_expiry !== "number" || isNaN(keyset_expiry)) {
65
+ // Validate keyset expiry time
66
+ throw new TypeError("Expected 'keyset_expiry' to be a number!");
67
+ }
68
+ this.keyset_expiry = keyset_expiry;
69
+ // Parse keys from options
70
+ this._raw_encryption_key = encryption?.value
71
+ ? Raw_JWT_Keys_Store.parseKeyValue(encryption)
72
+ : null;
73
+ this._raw_decryption_key = Raw_JWT_Keys_Store.parseKeyValue(decryption);
74
+ this._raw_signing_key = signing?.value
75
+ ? Raw_JWT_Keys_Store.parseKeyValue(signing)
76
+ : null;
77
+ this._raw_verification_key = Raw_JWT_Keys_Store.parseKeyValue(verification);
78
+ // Enable auth server mode if specified (throws if missing signing/encryption keys)
79
+ this.is_auth_server = is_auth_server || false;
80
+ if (this.is_auth_server) {
81
+ // Signing & Encryption Keys are required for the auth server
82
+ if (!this._raw_encryption_key || !this._raw_signing_key) {
83
+ throw new Error("Missing required key(s) for auth server");
84
+ }
85
+ }
86
+ // Throw if decryption or verifier are missing (always required)
87
+ if (!this._raw_decryption_key) {
88
+ throw new Error("Decryption key must always be present!");
89
+ }
90
+ else if (!this._raw_verification_key) {
91
+ throw new Error("Verifier key must always be present!");
92
+ }
93
+ }
94
+ // Returns the PEM-encoded encryption key, if stored
95
+ get encryption() {
96
+ return this._raw_encryption_key ?? null;
97
+ }
98
+ // Returns the PEM-encoded decryption key
99
+ get decryption() {
100
+ return this._raw_decryption_key;
101
+ }
102
+ // Returns the PEM-encoded signing key, if stored
103
+ get signing() {
104
+ return this._raw_signing_key;
105
+ }
106
+ // Returns the PEM-encoded verification key
107
+ get verification() {
108
+ return this._raw_verification_key;
109
+ }
110
+ get encryption_base64url() {
111
+ return this.encryption
112
+ ? Raw_JWT_Keys_Store.encodeBase64Url(this.encryption)
113
+ : null;
114
+ }
115
+ get decryption_base64url() {
116
+ return Raw_JWT_Keys_Store.encodeBase64Url(this.decryption);
117
+ }
118
+ get verification_base64url() {
119
+ return Raw_JWT_Keys_Store.encodeBase64Url(this.verification);
120
+ }
121
+ get signing_base64url() {
122
+ return this.signing
123
+ ? Raw_JWT_Keys_Store.encodeBase64Url(this.signing)
124
+ : null;
125
+ }
126
+ get encryption_json() {
127
+ const value = this.encryption;
128
+ if (!value) {
129
+ return null;
130
+ }
131
+ return {
132
+ format: "pem",
133
+ value,
134
+ privacy_level: "public",
135
+ key_type: "encryption",
136
+ keyset_id: this.keyset_id,
137
+ audience_id: this.audience_id,
138
+ };
139
+ }
140
+ get decryption_json() {
141
+ const value = this.decryption;
142
+ return {
143
+ format: "pem",
144
+ value,
145
+ privacy_level: "private", // decryption is with private-key, counter-intuitively
146
+ key_type: "decryption",
147
+ keyset_id: this.keyset_id,
148
+ audience_id: this.audience_id,
149
+ };
150
+ }
151
+ get signing_json() {
152
+ const value = this.signing;
153
+ if (!value) {
154
+ return null;
155
+ }
156
+ return {
157
+ format: "pem",
158
+ value,
159
+ privacy_level: "private",
160
+ key_type: "signing",
161
+ keyset_id: this.keyset_id,
162
+ audience_id: this.audience_id,
163
+ };
164
+ }
165
+ get verification_json() {
166
+ const value = this.verification;
167
+ return {
168
+ format: "pem",
169
+ value,
170
+ privacy_level: "public",
171
+ key_type: "verification",
172
+ keyset_id: this.keyset_id,
173
+ audience_id: this.audience_id,
174
+ };
175
+ }
176
+ listSerializedKeys() {
177
+ const keys = [
178
+ this.decryption_json,
179
+ this.verification_json,
180
+ ];
181
+ if (this.encryption) {
182
+ keys.push(this.encryption_json);
183
+ }
184
+ if (this.signing) {
185
+ keys.push(this.signing_json);
186
+ }
187
+ return keys;
188
+ }
189
+ }
190
+ export default Raw_JWT_Keys_Store;
191
+ //# sourceMappingURL=raw_jwt_keys_store.js.map