@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.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt/aud.d.ts +1 -0
- package/dist/jwt/aud.js +3 -0
- package/dist/jwt/aud.js.map +1 -0
- package/dist/jwt/decode.d.ts +22 -0
- package/dist/jwt/decode.js +228 -0
- package/dist/jwt/decode.js.map +1 -0
- package/dist/jwt/encrypt_decrypt_alg.d.ts +3 -0
- package/dist/jwt/encrypt_decrypt_alg.js +4 -0
- package/dist/jwt/encrypt_decrypt_alg.js.map +1 -0
- package/dist/jwt/expiry.d.ts +1 -0
- package/dist/jwt/expiry.js +2 -0
- package/dist/jwt/expiry.js.map +1 -0
- package/dist/jwt/generate.d.ts +31 -0
- package/dist/jwt/generate.js +188 -0
- package/dist/jwt/generate.js.map +1 -0
- package/dist/jwt/get_audience_from_token.d.ts +1 -0
- package/dist/jwt/get_audience_from_token.js +17 -0
- package/dist/jwt/get_audience_from_token.js.map +1 -0
- package/dist/jwt/get_keyset_id_from_token.d.ts +2 -0
- package/dist/jwt/get_keyset_id_from_token.js +17 -0
- package/dist/jwt/get_keyset_id_from_token.js.map +1 -0
- package/dist/jwt/index.d.ts +9 -0
- package/dist/jwt/index.js +9 -0
- package/dist/jwt/index.js.map +1 -0
- package/dist/jwt/iss.d.ts +1 -0
- package/dist/jwt/iss.js +3 -0
- package/dist/jwt/iss.js.map +1 -0
- package/dist/jwt/jwt-factory.d.ts +34 -0
- package/dist/jwt/jwt-factory.js +147 -0
- package/dist/jwt/jwt-factory.js.map +1 -0
- package/dist/jwt/jwt_keys/AbstractBaseKeyPairFactory.d.ts +11 -0
- package/dist/jwt/jwt_keys/AbstractBaseKeyPairFactory.js +26 -0
- package/dist/jwt/jwt_keys/AbstractBaseKeyPairFactory.js.map +1 -0
- package/dist/jwt/jwt_keys/ContentEncryptionKeyPairFactory.d.ts +14 -0
- package/dist/jwt/jwt_keys/ContentEncryptionKeyPairFactory.js +45 -0
- package/dist/jwt/jwt_keys/ContentEncryptionKeyPairFactory.js.map +1 -0
- package/dist/jwt/jwt_keys/I_JWT_Keys.d.ts +15 -0
- package/dist/jwt/jwt_keys/I_JWT_Keys.js +2 -0
- package/dist/jwt/jwt_keys/I_JWT_Keys.js.map +1 -0
- package/dist/jwt/jwt_keys/JWK.d.ts +2 -0
- package/dist/jwt/jwt_keys/JWK.js +2 -0
- package/dist/jwt/jwt_keys/JWK.js.map +1 -0
- package/dist/jwt/jwt_keys/JWKS.d.ts +4 -0
- package/dist/jwt/jwt_keys/JWKS.js +2 -0
- package/dist/jwt/jwt_keys/JWKS.js.map +1 -0
- package/dist/jwt/jwt_keys/JsonSerializedJwtKey.d.ts +43 -0
- package/dist/jwt/jwt_keys/JsonSerializedJwtKey.js +38 -0
- package/dist/jwt/jwt_keys/JsonSerializedJwtKey.js.map +1 -0
- package/dist/jwt/jwt_keys/SigningKeyPairFactory.d.ts +14 -0
- package/dist/jwt/jwt_keys/SigningKeyPairFactory.js +46 -0
- package/dist/jwt/jwt_keys/SigningKeyPairFactory.js.map +1 -0
- package/dist/jwt/jwt_keys/ValidJwtKeyTypes.d.ts +4 -0
- package/dist/jwt/jwt_keys/ValidJwtKeyTypes.js +7 -0
- package/dist/jwt/jwt_keys/ValidJwtKeyTypes.js.map +1 -0
- package/dist/jwt/jwt_keys/generate_new_jwt_keyset.d.ts +21 -0
- package/dist/jwt/jwt_keys/generate_new_jwt_keyset.js +110 -0
- package/dist/jwt/jwt_keys/generate_new_jwt_keyset.js.map +1 -0
- package/dist/jwt/jwt_keys/getAlgorithmForKey.d.ts +2 -0
- package/dist/jwt/jwt_keys/getAlgorithmForKey.js +14 -0
- package/dist/jwt/jwt_keys/getAlgorithmForKey.js.map +1 -0
- package/dist/jwt/jwt_keys/importAsymmetricJWK.d.ts +3 -0
- package/dist/jwt/jwt_keys/importAsymmetricJWK.js +15 -0
- package/dist/jwt/jwt_keys/importAsymmetricJWK.js.map +1 -0
- package/dist/jwt/jwt_keys/index.d.ts +13 -0
- package/dist/jwt/jwt_keys/index.js +12 -0
- package/dist/jwt/jwt_keys/index.js.map +1 -0
- package/dist/jwt/jwt_keys/jwt_keys.d.ts +33 -0
- package/dist/jwt/jwt_keys/jwt_keys.js +96 -0
- package/dist/jwt/jwt_keys/jwt_keys.js.map +1 -0
- package/dist/jwt/jwt_keys/pem-format.d.ts +17 -0
- package/dist/jwt/jwt_keys/pem-format.js +69 -0
- package/dist/jwt/jwt_keys/pem-format.js.map +1 -0
- package/dist/jwt/jwt_keys/raw_jwt_keys_store.d.ts +38 -0
- package/dist/jwt/jwt_keys/raw_jwt_keys_store.js +191 -0
- package/dist/jwt/jwt_keys/raw_jwt_keys_store.js.map +1 -0
- package/dist/jwt/jwt_keys/to_public_jwks.d.ts +6 -0
- package/dist/jwt/jwt_keys/to_public_jwks.js +39 -0
- package/dist/jwt/jwt_keys/to_public_jwks.js.map +1 -0
- package/dist/jwt/payload_data.d.ts +73 -0
- package/dist/jwt/payload_data.js +45 -0
- package/dist/jwt/payload_data.js.map +1 -0
- package/dist/jwt/sign.d.ts +23 -0
- package/dist/jwt/sign.js +68 -0
- package/dist/jwt/sign.js.map +1 -0
- package/dist/jwt/sign_verify_alg.d.ts +2 -0
- package/dist/jwt/sign_verify_alg.js +3 -0
- package/dist/jwt/sign_verify_alg.js.map +1 -0
- package/dist/jwt/verify_signature.d.ts +23 -0
- package/dist/jwt/verify_signature.js +86 -0
- package/dist/jwt/verify_signature.js.map +1 -0
- package/dist/utils/fromBase64UrlEncoded.d.ts +2 -0
- package/dist/utils/fromBase64UrlEncoded.js +5 -0
- package/dist/utils/fromBase64UrlEncoded.js.map +1 -0
- package/dist/utils/getDefaultDebugState.d.ts +2 -0
- package/dist/utils/getDefaultDebugState.js +7 -0
- package/dist/utils/getDefaultDebugState.js.map +1 -0
- package/dist/utils/isValidBase64UrlEncoding.d.ts +2 -0
- package/dist/utils/isValidBase64UrlEncoding.js +18 -0
- package/dist/utils/isValidBase64UrlEncoding.js.map +1 -0
- package/dist/utils/isValidUuid.d.ts +2 -0
- package/dist/utils/isValidUuid.js +4 -0
- package/dist/utils/isValidUuid.js.map +1 -0
- package/dist/utils/maybeStripQuotes.d.ts +8 -0
- package/dist/utils/maybeStripQuotes.js +20 -0
- package/dist/utils/maybeStripQuotes.js.map +1 -0
- package/dist/utils/toBase64UrlEncoded.d.ts +2 -0
- package/dist/utils/toBase64UrlEncoded.js +5 -0
- package/dist/utils/toBase64UrlEncoded.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type AccessToken, type RefreshToken, type UserData, type RequestTokensResult, type OrganizationID } from "@schemavaults/auth-common";
|
|
2
|
+
import { type SchemaVaultsAppEnvironment } from "@schemavaults/app-definitions";
|
|
3
|
+
import type { I_JWT_Keys } from "./jwt_keys";
|
|
4
|
+
export interface IJWT_Factory_Init_Options {
|
|
5
|
+
user: UserData;
|
|
6
|
+
client_app_id: string;
|
|
7
|
+
jwt_keys: I_JWT_Keys;
|
|
8
|
+
environment: SchemaVaultsAppEnvironment;
|
|
9
|
+
user_organizations: readonly OrganizationID[];
|
|
10
|
+
}
|
|
11
|
+
export declare class JWT_Factory {
|
|
12
|
+
/**
|
|
13
|
+
* ID of api server
|
|
14
|
+
* validated to be either auth server url or uuid_v4 in constructor
|
|
15
|
+
*/
|
|
16
|
+
private readonly client_app_id;
|
|
17
|
+
private readonly user;
|
|
18
|
+
private static readonly REFRESH_TOKEN_AUDIENCE;
|
|
19
|
+
private readonly jwt_keys;
|
|
20
|
+
private readonly environment;
|
|
21
|
+
private readonly user_organizations;
|
|
22
|
+
constructor(opts: IJWT_Factory_Init_Options);
|
|
23
|
+
private get uid();
|
|
24
|
+
private static get iat();
|
|
25
|
+
private generate;
|
|
26
|
+
refresh(): Promise<RefreshToken>;
|
|
27
|
+
access(audience: string): Promise<AccessToken>;
|
|
28
|
+
private multipleAccessTokens;
|
|
29
|
+
/**
|
|
30
|
+
*
|
|
31
|
+
* @returns Promise to result of generating access and/or refresh tokens
|
|
32
|
+
*/
|
|
33
|
+
generateTokens(audiences?: string[] | string, replaceRefresh?: boolean): Promise<RequestTokensResult>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { audienceRefSchema, } from "@schemavaults/auth-common";
|
|
2
|
+
import { appIdSchema, SCHEMAVAULTS_AUTH_APP_DEFINITION, schemaVaultsAppEnvironmentSchema, schemaVaultsAppEnvironments, } from "@schemavaults/app-definitions";
|
|
3
|
+
import { generateJWT } from "./generate";
|
|
4
|
+
import { REFRESH_TOKEN_AUDIENCE } from "./aud";
|
|
5
|
+
// This class is used to generate JWTs for a single user
|
|
6
|
+
// Initialize the factory with a user ID, then call loadUserData() to load the user's data
|
|
7
|
+
// Once the user's data is loaded, you can call refresh() or access() to generate a token
|
|
8
|
+
export class JWT_Factory {
|
|
9
|
+
/**
|
|
10
|
+
* ID of api server
|
|
11
|
+
* validated to be either auth server url or uuid_v4 in constructor
|
|
12
|
+
*/
|
|
13
|
+
client_app_id;
|
|
14
|
+
user;
|
|
15
|
+
static REFRESH_TOKEN_AUDIENCE = REFRESH_TOKEN_AUDIENCE;
|
|
16
|
+
jwt_keys;
|
|
17
|
+
environment;
|
|
18
|
+
user_organizations;
|
|
19
|
+
constructor(opts) {
|
|
20
|
+
// Save user data
|
|
21
|
+
this.user = opts.user;
|
|
22
|
+
// Get client app id
|
|
23
|
+
const parsed_client_app_id = appIdSchema.safeParse(opts.client_app_id);
|
|
24
|
+
if (!parsed_client_app_id.success) {
|
|
25
|
+
throw new Error("Invalid client app ID");
|
|
26
|
+
}
|
|
27
|
+
this.client_app_id = parsed_client_app_id.data;
|
|
28
|
+
// JWT Keys
|
|
29
|
+
this.jwt_keys = opts.jwt_keys;
|
|
30
|
+
// App environment (sets 'env' field of generated tokens)
|
|
31
|
+
const parsed_app_environment = schemaVaultsAppEnvironmentSchema.safeParse(opts.environment);
|
|
32
|
+
if (!parsed_app_environment.success) {
|
|
33
|
+
throw new Error(`Invalid app environment to generate tokens for! Should be one of: ${schemaVaultsAppEnvironments.map((s) => `"${s}"`).join(", ")}`);
|
|
34
|
+
}
|
|
35
|
+
this.environment = parsed_app_environment.data;
|
|
36
|
+
this.user_organizations = opts.user_organizations;
|
|
37
|
+
}
|
|
38
|
+
get uid() {
|
|
39
|
+
const user = this.user;
|
|
40
|
+
if (typeof user.uid !== "string") {
|
|
41
|
+
throw new Error(`Invalid user ID, not a string! Received typeof ${typeof user.uid}`);
|
|
42
|
+
}
|
|
43
|
+
return this.user.uid;
|
|
44
|
+
}
|
|
45
|
+
static get iat() {
|
|
46
|
+
return Date.now();
|
|
47
|
+
}
|
|
48
|
+
async generate(type, aud) {
|
|
49
|
+
// Make sure the token type is valid
|
|
50
|
+
if (type !== "refresh" && type !== "access") {
|
|
51
|
+
throw new Error("Invalid token type");
|
|
52
|
+
}
|
|
53
|
+
if (!aud || typeof aud !== "string") {
|
|
54
|
+
throw new Error("Missing audience argument");
|
|
55
|
+
}
|
|
56
|
+
const uid = this.uid;
|
|
57
|
+
if (this.user.uid !== uid) {
|
|
58
|
+
throw new Error("User data does not match user ID");
|
|
59
|
+
}
|
|
60
|
+
const iat = JWT_Factory.iat;
|
|
61
|
+
if (type === "refresh") {
|
|
62
|
+
// refresh tokens are always addressed to the auth server
|
|
63
|
+
if (aud !== SCHEMAVAULTS_AUTH_APP_DEFINITION.app_id ||
|
|
64
|
+
aud !== REFRESH_TOKEN_AUDIENCE) {
|
|
65
|
+
throw new Error("Refresh tokens must have an audience directed at the SchemaVaults Auth platform");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (aud === SCHEMAVAULTS_AUTH_APP_DEFINITION.app_id) {
|
|
69
|
+
// Always allow audience to be the
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const parsed_as_uuid_aud = await audienceRefSchema.safeParseAsync(aud);
|
|
73
|
+
if (!parsed_as_uuid_aud.success) {
|
|
74
|
+
throw new Error("Expected audience to reference a valid app, API, or FS server!");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const generateTokenOptions = {
|
|
78
|
+
user: this.user,
|
|
79
|
+
type,
|
|
80
|
+
iat,
|
|
81
|
+
audience: aud,
|
|
82
|
+
client_app_id: this.client_app_id,
|
|
83
|
+
jwt_keys: this.jwt_keys,
|
|
84
|
+
env: this.environment,
|
|
85
|
+
orgs: this.user_organizations,
|
|
86
|
+
};
|
|
87
|
+
const jwt = await generateJWT(generateTokenOptions);
|
|
88
|
+
return jwt;
|
|
89
|
+
}
|
|
90
|
+
async refresh() {
|
|
91
|
+
const REFRESH_TOKEN_AUDIENCE = JWT_Factory.REFRESH_TOKEN_AUDIENCE;
|
|
92
|
+
return await this.generate("refresh", REFRESH_TOKEN_AUDIENCE);
|
|
93
|
+
}
|
|
94
|
+
async access(audience) {
|
|
95
|
+
return await this.generate("access", audience);
|
|
96
|
+
}
|
|
97
|
+
async multipleAccessTokens(audiences) {
|
|
98
|
+
const accessTokens = {};
|
|
99
|
+
const accessTokenPromises = audiences.map((audience) => {
|
|
100
|
+
return this.access(audience);
|
|
101
|
+
});
|
|
102
|
+
const accessTokensList = await Promise.all(accessTokenPromises);
|
|
103
|
+
accessTokensList.forEach((access_token) => {
|
|
104
|
+
accessTokens[access_token.aud] = access_token;
|
|
105
|
+
});
|
|
106
|
+
return accessTokens;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
*
|
|
110
|
+
* @returns Promise to result of generating access and/or refresh tokens
|
|
111
|
+
*/
|
|
112
|
+
async generateTokens(audiences, replaceRefresh) {
|
|
113
|
+
const client_app_id = this.client_app_id;
|
|
114
|
+
let access_token_audiences;
|
|
115
|
+
if (typeof audiences === "string")
|
|
116
|
+
access_token_audiences = [audiences];
|
|
117
|
+
else if (Array.isArray(audiences)) {
|
|
118
|
+
access_token_audiences = audiences;
|
|
119
|
+
}
|
|
120
|
+
else
|
|
121
|
+
throw new Error("Invalid audiences argument to JWT_Factory.generateTokens()");
|
|
122
|
+
if (access_token_audiences.length === 0)
|
|
123
|
+
console.warn("Did not receive any audiences to create access tokens for");
|
|
124
|
+
else if (access_token_audiences.length > 16)
|
|
125
|
+
throw new Error("Cannot request more than 16 access tokens at one time");
|
|
126
|
+
try {
|
|
127
|
+
const refreshTokenPromise = replaceRefresh ? this.refresh() : (async () => undefined)();
|
|
128
|
+
const tokenGenerationResult = {
|
|
129
|
+
success: true,
|
|
130
|
+
error: false,
|
|
131
|
+
message: "Generated token(s) successfully",
|
|
132
|
+
client_app_id,
|
|
133
|
+
tokens: {
|
|
134
|
+
refresh: await refreshTokenPromise,
|
|
135
|
+
access: await this.multipleAccessTokens(access_token_audiences),
|
|
136
|
+
},
|
|
137
|
+
userData: this.user,
|
|
138
|
+
};
|
|
139
|
+
return tokenGenerationResult;
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
console.error(e);
|
|
143
|
+
throw new Error(`Failed to generate initial tokens for uid ${this.uid}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=jwt-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-factory.js","sourceRoot":"","sources":["../../src/jwt/jwt-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface BaseKeyPairFactoryOptions {
|
|
2
|
+
debug?: boolean;
|
|
3
|
+
}
|
|
4
|
+
export declare abstract class AbstractBaseKeyPairFactory {
|
|
5
|
+
protected readonly debug: boolean;
|
|
6
|
+
constructor(options?: BaseKeyPairFactoryOptions);
|
|
7
|
+
protected static toPemFormat(key: ArrayBuffer, key_type: "PUBLIC" | "PRIVATE"): string;
|
|
8
|
+
protected static exportKeyPair([privateKey, publicKey]: readonly [privateKey: string, publicKey: string], export_method: "pem" | "base64url"): readonly [string, string];
|
|
9
|
+
abstract generate(export_method: "pem" | "base64url"): Promise<readonly [privateKey: string, publicKey: string]>;
|
|
10
|
+
}
|
|
11
|
+
export default AbstractBaseKeyPairFactory;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { base64url } from "jose";
|
|
2
|
+
import { PEMFormat } from "./pem-format";
|
|
3
|
+
export class AbstractBaseKeyPairFactory {
|
|
4
|
+
debug;
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.debug = options.debug || false;
|
|
7
|
+
}
|
|
8
|
+
static toPemFormat(key, key_type) {
|
|
9
|
+
return PEMFormat.toPemFormat(key, key_type);
|
|
10
|
+
}
|
|
11
|
+
static exportKeyPair([privateKey, publicKey], export_method) {
|
|
12
|
+
switch (export_method) {
|
|
13
|
+
case "pem":
|
|
14
|
+
return [privateKey, publicKey];
|
|
15
|
+
case "base64url":
|
|
16
|
+
return [
|
|
17
|
+
base64url.encode(privateKey),
|
|
18
|
+
base64url.encode(publicKey),
|
|
19
|
+
];
|
|
20
|
+
default:
|
|
21
|
+
throw new Error("Received invalid 'export_method' to generate key pair with!");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export default AbstractBaseKeyPairFactory;
|
|
26
|
+
//# sourceMappingURL=AbstractBaseKeyPairFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractBaseKeyPairFactory.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/AbstractBaseKeyPairFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,MAAM,OAAgB,0BAA0B;IAC3B,KAAK,CAAU;IAElC,YAAmB,UAAqC,EAAE;QACxD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACtC,CAAC;IAES,MAAM,CAAC,WAAW,CAAC,GAAgB,EAAE,QAA8B;QAC3E,OAAO,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAES,MAAM,CAAC,aAAa,CAAC,CAAC,UAAU,EAAE,SAAS,CAAmD,EAAE,aAAkC;QAC1I,QAAQ,aAAa,EAAE,CAAC;YACtB,KAAK,KAAK;gBACR,OAAO,CAAC,UAAU,EAAE,SAAS,CAG5B,CAAC;YACJ,KAAK,WAAW;gBACd,OAAO;oBACL,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;oBAC5B,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;iBACiB,CAAC;YACjD;gBACE,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QACN,CAAC;IACH,CAAC;CAGF;AAED,eAAe,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import AbstractBaseKeyPairFactory from "./AbstractBaseKeyPairFactory";
|
|
2
|
+
export interface ContentEncryptionKeyPairFactoryOptions {
|
|
3
|
+
debug?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* @name ContentEncryptionKeyPairFactory
|
|
7
|
+
* @see ContentEncyptionKeyPairFactory.generate()
|
|
8
|
+
* @description Generates an encryption/decryption key pair
|
|
9
|
+
*/
|
|
10
|
+
export declare class ContentEncryptionKeyPairFactory extends AbstractBaseKeyPairFactory {
|
|
11
|
+
private static generateRsaPemEncryptionAndDecryptionKeyPair;
|
|
12
|
+
generate(export_method: "base64url" | "pem"): Promise<readonly [privateKey: string, publicKey: string]>;
|
|
13
|
+
}
|
|
14
|
+
export default ContentEncryptionKeyPairFactory;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import AbstractBaseKeyPairFactory from "./AbstractBaseKeyPairFactory";
|
|
2
|
+
/**
|
|
3
|
+
* @name ContentEncryptionKeyPairFactory
|
|
4
|
+
* @see ContentEncyptionKeyPairFactory.generate()
|
|
5
|
+
* @description Generates an encryption/decryption key pair
|
|
6
|
+
*/
|
|
7
|
+
export class ContentEncryptionKeyPairFactory extends AbstractBaseKeyPairFactory {
|
|
8
|
+
static async generateRsaPemEncryptionAndDecryptionKeyPair(debug = false) {
|
|
9
|
+
const keyPair = await crypto.subtle.generateKey({
|
|
10
|
+
name: "RSA-OAEP",
|
|
11
|
+
modulusLength: 2048,
|
|
12
|
+
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
|
|
13
|
+
hash: "SHA-256",
|
|
14
|
+
}, true, ["encrypt", "decrypt"]);
|
|
15
|
+
if (debug) {
|
|
16
|
+
console.log("[JWT_Keys] generateRsaPemEncryptionAndDecryptionKeyPair() -> ", {
|
|
17
|
+
publicKey: keyPair.publicKey,
|
|
18
|
+
privateKey: keyPair.privateKey,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const exportedPrivateKey = await crypto.subtle.exportKey("pkcs8", keyPair.privateKey);
|
|
22
|
+
const exportedPublicKey = await crypto.subtle.exportKey("spki", keyPair.publicKey);
|
|
23
|
+
if (debug) {
|
|
24
|
+
console.log("[JWT_Keys] generateRsaPemEncryptionAndDecryptionKeyPair() exported: -> ", {
|
|
25
|
+
exportedPublicKey,
|
|
26
|
+
exportedPrivateKey,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const pemPrivateKey = ContentEncryptionKeyPairFactory.toPemFormat(exportedPrivateKey, "PRIVATE");
|
|
30
|
+
const pemPublicKey = ContentEncryptionKeyPairFactory.toPemFormat(exportedPublicKey, "PUBLIC");
|
|
31
|
+
if (debug) {
|
|
32
|
+
console.log("[JWT_Keys] generateRsaPemEncryptionAndDecryptionKeyPair() pem format: -> ", {
|
|
33
|
+
pemPublicKey,
|
|
34
|
+
pemPrivateKey,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return [pemPrivateKey, pemPublicKey];
|
|
38
|
+
}
|
|
39
|
+
async generate(export_method) {
|
|
40
|
+
const [privateKey, publicKey] = await ContentEncryptionKeyPairFactory.generateRsaPemEncryptionAndDecryptionKeyPair(this.debug);
|
|
41
|
+
return ContentEncryptionKeyPairFactory.exportKeyPair([privateKey, publicKey], export_method);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export default ContentEncryptionKeyPairFactory;
|
|
45
|
+
//# sourceMappingURL=ContentEncryptionKeyPairFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentEncryptionKeyPairFactory.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/ContentEncryptionKeyPairFactory.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,MAAM,8BAA8B,CAAC;AAMtE;;;;GAIG;AACH,MAAM,OAAO,+BAAgC,SAAQ,0BAA0B;IACrE,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,QAAiB,KAAK;QAGtF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAC7C;YACE,IAAI,EAAE,UAAU;YAChB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,EAAE,SAAS;SAChB,EACD,IAAI,EACJ,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,+DAA+D,EAAE;gBAC3E,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,kBAAkB,GAAgB,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACnE,OAAO,EACP,OAAO,CAAC,UAAU,CACnB,CAAC;QACF,MAAM,iBAAiB,GAAgB,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAClE,MAAM,EACN,OAAO,CAAC,SAAS,CAClB,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,yEAAyE,EAAE;gBACrF,iBAAiB;gBACjB,kBAAkB;aACnB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAW,+BAA+B,CAAC,WAAW,CACvE,kBAAkB,EAClB,SAAS,CACV,CAAC;QACF,MAAM,YAAY,GAAW,+BAA+B,CAAC,WAAW,CACtE,iBAAiB,EACjB,QAAQ,CACT,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,2EAA2E,EAAE;gBACvF,YAAY;gBACZ,aAAa;aACd,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,aAAa,EAAE,YAAY,CAGlC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,aAAkC;QACtD,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,MAAM,+BAA+B,CAAC,4CAA4C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/H,OAAO,+BAA+B,CAAC,aAAa,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,CAAA;IAC9F,CAAC;CACF;AAED,eAAe,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { JsonSerializedJwtKey } from "./JsonSerializedJwtKey";
|
|
2
|
+
export interface I_JWT_Keys {
|
|
3
|
+
audience_id: string;
|
|
4
|
+
keyset_id: string;
|
|
5
|
+
keyset_expiry: number;
|
|
6
|
+
signing_key: Promise<CryptoKey> | null;
|
|
7
|
+
signing_key_json: JsonSerializedJwtKey | null;
|
|
8
|
+
verification_key: Promise<CryptoKey>;
|
|
9
|
+
verification_key_json: JsonSerializedJwtKey;
|
|
10
|
+
encryption_key: Promise<CryptoKey> | null;
|
|
11
|
+
encryption_key_json: JsonSerializedJwtKey | null;
|
|
12
|
+
decryption_key: Promise<CryptoKey>;
|
|
13
|
+
decryption_key_json: JsonSerializedJwtKey;
|
|
14
|
+
listSerializedKeys(): readonly JsonSerializedJwtKey[];
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"I_JWT_Keys.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/I_JWT_Keys.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JWK.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/JWK.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JWKS.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/JWKS.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const jsonSerializedJwtKeySchema: z.ZodEffects<z.ZodObject<{
|
|
3
|
+
audience_id: z.ZodUnion<[z.ZodString, z.ZodLiteral<"schemavaults-registry">, z.ZodLiteral<"schemavaults-auth">, z.ZodLiteral<"schemavaults-mail">]>;
|
|
4
|
+
keyset_id: z.ZodString;
|
|
5
|
+
keyset_expiry: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
value: z.ZodString;
|
|
7
|
+
format: z.ZodEnum<["pem", "base64url"]>;
|
|
8
|
+
privacy_level: z.ZodEnum<["private", "public"]>;
|
|
9
|
+
key_type: z.ZodEnum<["encryption", "decryption", "signing", "verification"]>;
|
|
10
|
+
}, "strict", z.ZodTypeAny, {
|
|
11
|
+
audience_id: string;
|
|
12
|
+
keyset_id: string;
|
|
13
|
+
value: string;
|
|
14
|
+
format: "base64url" | "pem";
|
|
15
|
+
privacy_level: "private" | "public";
|
|
16
|
+
key_type: "encryption" | "decryption" | "signing" | "verification";
|
|
17
|
+
keyset_expiry?: number | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
audience_id: string;
|
|
20
|
+
keyset_id: string;
|
|
21
|
+
value: string;
|
|
22
|
+
format: "base64url" | "pem";
|
|
23
|
+
privacy_level: "private" | "public";
|
|
24
|
+
key_type: "encryption" | "decryption" | "signing" | "verification";
|
|
25
|
+
keyset_expiry?: number | undefined;
|
|
26
|
+
}>, {
|
|
27
|
+
audience_id: string;
|
|
28
|
+
keyset_id: string;
|
|
29
|
+
value: string;
|
|
30
|
+
format: "base64url" | "pem";
|
|
31
|
+
privacy_level: "private" | "public";
|
|
32
|
+
key_type: "encryption" | "decryption" | "signing" | "verification";
|
|
33
|
+
keyset_expiry?: number | undefined;
|
|
34
|
+
}, {
|
|
35
|
+
audience_id: string;
|
|
36
|
+
keyset_id: string;
|
|
37
|
+
value: string;
|
|
38
|
+
format: "base64url" | "pem";
|
|
39
|
+
privacy_level: "private" | "public";
|
|
40
|
+
key_type: "encryption" | "decryption" | "signing" | "verification";
|
|
41
|
+
keyset_expiry?: number | undefined;
|
|
42
|
+
}>;
|
|
43
|
+
export type JsonSerializedJwtKey = z.infer<typeof jsonSerializedJwtKeySchema>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// JsonSerializedJwtKey.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { validJwtKeyTypesList } from "./ValidJwtKeyTypes";
|
|
4
|
+
import { apiServerIdSchema } from "@schemavaults/app-definitions";
|
|
5
|
+
import PEMFormat from "./pem-format";
|
|
6
|
+
export const jsonSerializedJwtKeySchema = z
|
|
7
|
+
.object({
|
|
8
|
+
audience_id: apiServerIdSchema,
|
|
9
|
+
keyset_id: z.string().uuid(),
|
|
10
|
+
keyset_expiry: z.number().nonnegative().optional(),
|
|
11
|
+
value: z.string().min(1),
|
|
12
|
+
format: z.enum(["pem", "base64url"]),
|
|
13
|
+
privacy_level: z.enum(["private", "public"]),
|
|
14
|
+
key_type: z.enum(validJwtKeyTypesList),
|
|
15
|
+
})
|
|
16
|
+
.required({
|
|
17
|
+
audience_id: true,
|
|
18
|
+
keyset_id: true,
|
|
19
|
+
value: true,
|
|
20
|
+
format: true,
|
|
21
|
+
privacy_level: true,
|
|
22
|
+
key_type: true,
|
|
23
|
+
})
|
|
24
|
+
.strict()
|
|
25
|
+
.refine((key) => {
|
|
26
|
+
if (key.format === "pem" &&
|
|
27
|
+
key.privacy_level === "public" &&
|
|
28
|
+
!PEMFormat.isPemFormat(key.value, "PUBLIC")) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
if (key.format === "pem" &&
|
|
32
|
+
key.privacy_level === "private" &&
|
|
33
|
+
!PEMFormat.isPemFormat(key.value, "PRIVATE")) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}, "Mismatch between 'privacy_level' and header of PEM-formatted key");
|
|
38
|
+
//# sourceMappingURL=JsonSerializedJwtKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonSerializedJwtKey.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/JsonSerializedJwtKey.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC;IACN,WAAW,EAAE,iBAAiB;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC5B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACpC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC5C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;CACvC,CAAC;KACD,QAAQ,CAAC;IACR,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,IAAI;IACf,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,aAAa,EAAE,IAAI;IACnB,QAAQ,EAAE,IAAI;CACf,CAAC;KACD,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,GAAG,EAAW,EAAE;IACvB,IACE,GAAG,CAAC,MAAM,KAAK,KAAK;QACpB,GAAG,CAAC,aAAa,KAAK,QAAQ;QAC9B,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,EAC3C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IACE,GAAG,CAAC,MAAM,KAAK,KAAK;QACpB,GAAG,CAAC,aAAa,KAAK,SAAS;QAC/B,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,EAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,EAAE,kEAAkE,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import AbstractBaseKeyPairFactory from "./AbstractBaseKeyPairFactory";
|
|
2
|
+
export interface SigningKeyPairFactoryOptions {
|
|
3
|
+
debug?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* @name SigningKeyPairFactory
|
|
7
|
+
* @see SigningKeyPairFactory.generate()
|
|
8
|
+
* @description Generates a signing/verifier RSA256 key pair
|
|
9
|
+
*/
|
|
10
|
+
export declare class SigningKeyPairFactory extends AbstractBaseKeyPairFactory {
|
|
11
|
+
private static generateRsaPemSigningAndVerificationKeyPair;
|
|
12
|
+
generate(export_method: "base64url" | "pem"): Promise<readonly [privateKey: string, publicKey: string]>;
|
|
13
|
+
}
|
|
14
|
+
export default SigningKeyPairFactory;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import AbstractBaseKeyPairFactory from "./AbstractBaseKeyPairFactory";
|
|
2
|
+
/**
|
|
3
|
+
* @name SigningKeyPairFactory
|
|
4
|
+
* @see SigningKeyPairFactory.generate()
|
|
5
|
+
* @description Generates a signing/verifier RSA256 key pair
|
|
6
|
+
*/
|
|
7
|
+
export class SigningKeyPairFactory extends AbstractBaseKeyPairFactory {
|
|
8
|
+
static async generateRsaPemSigningAndVerificationKeyPair(debug = false) {
|
|
9
|
+
const keyPair = await crypto.subtle.generateKey({
|
|
10
|
+
name: "RSASSA-PKCS1-v1_5",
|
|
11
|
+
modulusLength: 2048,
|
|
12
|
+
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
|
|
13
|
+
hash: "SHA-256",
|
|
14
|
+
}, true, ["sign", "verify"]);
|
|
15
|
+
if (debug) {
|
|
16
|
+
console.log("[JWT_Keys] generateRsaPemSigningAndVerificationKeyPair() -> ", {
|
|
17
|
+
publicKey: keyPair.publicKey,
|
|
18
|
+
privateKey: keyPair.privateKey,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const exportedPrivateKey = await crypto.subtle.exportKey("pkcs8", keyPair.privateKey);
|
|
22
|
+
const exportedPublicKey = await crypto.subtle.exportKey("spki", keyPair.publicKey);
|
|
23
|
+
if (debug) {
|
|
24
|
+
console.log("[JWT_Keys] generateRsaPemSigningAndVerificationKeyPair() exported: -> ", {
|
|
25
|
+
exportedPublicKey,
|
|
26
|
+
exportedPrivateKey,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const pemPrivateKey = SigningKeyPairFactory.toPemFormat(exportedPrivateKey, "PRIVATE");
|
|
30
|
+
const pemPublicKey = SigningKeyPairFactory.toPemFormat(exportedPublicKey, "PUBLIC");
|
|
31
|
+
if (debug) {
|
|
32
|
+
console.log("[JWT_Keys] generateRsaPemSigningAndVerificationKeyPair() pem format: -> ", {
|
|
33
|
+
pemPublicKey,
|
|
34
|
+
pemPrivateKey,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return [pemPrivateKey, pemPublicKey];
|
|
38
|
+
}
|
|
39
|
+
// Generate base64url-encoded [private, public] RSA key pair
|
|
40
|
+
async generate(export_method) {
|
|
41
|
+
const [privateKey, publicKey] = await SigningKeyPairFactory.generateRsaPemSigningAndVerificationKeyPair(this.debug);
|
|
42
|
+
return SigningKeyPairFactory.exportKeyPair([privateKey, publicKey], export_method);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export default SigningKeyPairFactory;
|
|
46
|
+
//# sourceMappingURL=SigningKeyPairFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SigningKeyPairFactory.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/SigningKeyPairFactory.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,MAAM,8BAA8B,CAAC;AAMtE;;;;GAIG;AACH,MAAM,OAAO,qBAAsB,SAAQ,0BAA0B;IAE3D,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,QAAiB,KAAK;QAGrF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAC7C;YACE,IAAI,EAAE,mBAAmB;YACzB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,EAAE,SAAS;SAChB,EACD,IAAI,EACJ,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,8DAA8D,EAAE;gBAC1E,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,kBAAkB,GAAgB,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACnE,OAAO,EACP,OAAO,CAAC,UAAU,CACnB,CAAC;QACF,MAAM,iBAAiB,GAAgB,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAClE,MAAM,EACN,OAAO,CAAC,SAAS,CAClB,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,wEAAwE,EAAE;gBACpF,iBAAiB;gBACjB,kBAAkB;aACnB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAW,qBAAqB,CAAC,WAAW,CAC7D,kBAAkB,EAClB,SAAS,CACV,CAAC;QACF,MAAM,YAAY,GAAW,qBAAqB,CAAC,WAAW,CAC5D,iBAAiB,EACjB,QAAQ,CACT,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,0EAA0E,EAAE;gBACtF,YAAY;gBACZ,aAAa;aACd,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,aAAa,EAAE,YAAY,CAGlC,CAAC;IACJ,CAAC;IAED,4DAA4D;IACrD,KAAK,CAAC,QAAQ,CACnB,aAAkC;QAElC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,MAAM,qBAAqB,CAAC,2CAA2C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEpH,OAAO,qBAAqB,CAAC,aAAa,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;IACrF,CAAC;CACF;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const validJwtKeyTypesList: readonly ["encryption", "decryption", "signing", "verification"];
|
|
2
|
+
export type JwtKeyType = typeof validJwtKeyTypesList[number];
|
|
3
|
+
export declare const validJwtKeyTypesSet: Set<JwtKeyType>;
|
|
4
|
+
export declare function isValidJwtKeyType(value: string): value is JwtKeyType;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// ValidJwtKeyTypes.ts
|
|
2
|
+
export const validJwtKeyTypesList = ['encryption', 'decryption', 'signing', 'verification'];
|
|
3
|
+
export const validJwtKeyTypesSet = new Set(validJwtKeyTypesList);
|
|
4
|
+
export function isValidJwtKeyType(value) {
|
|
5
|
+
return validJwtKeyTypesSet.has(value);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=ValidJwtKeyTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidJwtKeyTypes.js","sourceRoot":"","sources":["../../../src/jwt/jwt_keys/ValidJwtKeyTypes.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,CAAsC,CAAC;AAIjI,MAAM,CAAC,MAAM,mBAAmB,GAAoB,IAAI,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAElF,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAQ,mBAAyD,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import JWT_Keys from "./jwt_keys";
|
|
2
|
+
/**
|
|
3
|
+
* @name generateJwtSigningKeyPair
|
|
4
|
+
* @param debug Enable additional debug logging
|
|
5
|
+
* @returns A PKCS8 and SPKI formatted RS256 key pair
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateJwtSigningKeyPair(debug?: boolean): Promise<[private_key: string, public_key: string]>;
|
|
8
|
+
/**
|
|
9
|
+
* @name generateJwtContentEncryptionKeyPair()
|
|
10
|
+
* @param debug Enable additional debug logging
|
|
11
|
+
* @returns 256-bit base64url-encoded content encryption key (string)
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateJwtContentEncryptionKeyPair(debug?: boolean): Promise<[private_key: string, public_key: string]>;
|
|
14
|
+
export interface IGenerateNewJwtKeySetOpts {
|
|
15
|
+
audience_id: string;
|
|
16
|
+
keyset_id?: string;
|
|
17
|
+
keyset_expiry?: number;
|
|
18
|
+
debug?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function generateNewJwtKeySet(opts: IGenerateNewJwtKeySetOpts): Promise<JWT_Keys>;
|
|
21
|
+
export default generateNewJwtKeySet;
|