@xemahq/platform-common 0.1.5 → 0.1.7
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.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/blind-index.d.ts +7 -0
- package/dist/lib/blind-index.d.ts.map +1 -0
- package/dist/lib/blind-index.js +24 -0
- package/dist/lib/blind-index.js.map +1 -0
- package/dist/lib/envelope-encryption.d.ts +29 -0
- package/dist/lib/envelope-encryption.d.ts.map +1 -0
- package/dist/lib/envelope-encryption.js +187 -0
- package/dist/lib/envelope-encryption.js.map +1 -0
- package/dist/nestjs/auth/service-actor.guard.d.ts.map +1 -1
- package/dist/nestjs/auth/service-actor.guard.js +4 -3
- package/dist/nestjs/auth/service-actor.guard.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export * as Briefcase from './lib/briefcase/index';
|
|
|
4
4
|
export * from './lib/deliverable-output-contract';
|
|
5
5
|
export * from './lib/derive-required-workspace-slots';
|
|
6
6
|
export * from './lib/encryption';
|
|
7
|
+
export * from './lib/envelope-encryption';
|
|
8
|
+
export * from './lib/blind-index';
|
|
7
9
|
export * from './lib/errors/pipeline-errors';
|
|
8
10
|
export * from './lib/escape-for-prompt';
|
|
9
11
|
export * from './lib/to-prisma-json';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AAIpC,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AAGxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AAIpC,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AAGxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -43,6 +43,8 @@ exports.Briefcase = __importStar(require("./lib/briefcase/index"));
|
|
|
43
43
|
__exportStar(require("./lib/deliverable-output-contract"), exports);
|
|
44
44
|
__exportStar(require("./lib/derive-required-workspace-slots"), exports);
|
|
45
45
|
__exportStar(require("./lib/encryption"), exports);
|
|
46
|
+
__exportStar(require("./lib/envelope-encryption"), exports);
|
|
47
|
+
__exportStar(require("./lib/blind-index"), exports);
|
|
46
48
|
__exportStar(require("./lib/errors/pipeline-errors"), exports);
|
|
47
49
|
__exportStar(require("./lib/escape-for-prompt"), exports);
|
|
48
50
|
__exportStar(require("./lib/to-prisma-json"), exports);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,sDAAoC;AACpC,sDAAoC;AAIpC,mEAAmD;AACnD,oEAAkD;AAClD,wEAAsD;AACtD,mDAAiC;AACjC,+DAA6C;AAC7C,0DAAwC;AACxC,uDAAqC;AACrC,oDAAkC;AAClC,yDAAuC;AACvC,mEAAiD;AACjD,wDAAsC;AACtC,4DAA0C;AAC1C,yDAAuC;AACvC,yDAAuC;AACvC,gEAA8C;AAC9C,sDAAoC;AACpC,2DAAyC;AACzC,uDAAqC;AACrC,wDAAsC;AACtC,4DAA0C;AAC1C,wDAAsC;AACtC,sDAAoC;AACpC,qDAAmC;AACnC,qEAAmD;AACnD,0DAAwC;AAGxC,kEAAgD;AAChD,uDAAqC;AACrC,2DAAyC;AACzC,4DAA0C;AAG1C,yDAAuC;AAGvC,uDAAqC;AAGrC,iDAA+B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,sDAAoC;AACpC,sDAAoC;AAIpC,mEAAmD;AACnD,oEAAkD;AAClD,wEAAsD;AACtD,mDAAiC;AACjC,4DAA0C;AAC1C,oDAAkC;AAClC,+DAA6C;AAC7C,0DAAwC;AACxC,uDAAqC;AACrC,oDAAkC;AAClC,yDAAuC;AACvC,mEAAiD;AACjD,wDAAsC;AACtC,4DAA0C;AAC1C,yDAAuC;AACvC,yDAAuC;AACvC,gEAA8C;AAC9C,sDAAoC;AACpC,2DAAyC;AACzC,uDAAqC;AACrC,wDAAsC;AACtC,4DAA0C;AAC1C,wDAAsC;AACtC,sDAAoC;AACpC,qDAAmC;AACnC,qEAAmD;AACnD,0DAAwC;AAGxC,kEAAgD;AAChD,uDAAqC;AACrC,2DAAyC;AACzC,4DAA0C;AAG1C,yDAAuC;AAGvC,uDAAqC;AAGrC,iDAA+B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blind-index.d.ts","sourceRoot":"","sources":["../../src/lib/blind-index.ts"],"names":[],"mappings":"AA0EA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAGT"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.computeBlindIndex = computeBlindIndex;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const BLIND_INDEX_KEY_LENGTH = 32;
|
|
6
|
+
function deriveBlindIndexKey(kek, orgId, purpose) {
|
|
7
|
+
if (!Buffer.isBuffer(kek) || kek.byteLength !== BLIND_INDEX_KEY_LENGTH) {
|
|
8
|
+
throw new Error('Blind-index KEK must be a 32-byte Buffer.');
|
|
9
|
+
}
|
|
10
|
+
if (typeof orgId !== 'string' || orgId.length === 0) {
|
|
11
|
+
throw new Error('computeBlindIndex: orgId must be a non-empty string.');
|
|
12
|
+
}
|
|
13
|
+
if (typeof purpose !== 'string' || purpose.length === 0) {
|
|
14
|
+
throw new Error('computeBlindIndex: purpose must be a non-empty string.');
|
|
15
|
+
}
|
|
16
|
+
const info = Buffer.from(`xema:blind-index:v1:${orgId}:${purpose}`, 'utf8');
|
|
17
|
+
const derived = (0, node_crypto_1.hkdfSync)('sha256', kek, Buffer.alloc(0), info, BLIND_INDEX_KEY_LENGTH);
|
|
18
|
+
return Buffer.from(derived);
|
|
19
|
+
}
|
|
20
|
+
function computeBlindIndex(args) {
|
|
21
|
+
const key = deriveBlindIndexKey(args.kek, args.orgId, args.purpose);
|
|
22
|
+
return (0, node_crypto_1.createHmac)('sha256', key).update(args.value, 'utf8').digest('hex');
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=blind-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blind-index.js","sourceRoot":"","sources":["../../src/lib/blind-index.ts"],"names":[],"mappings":";;AA0EA,8CAQC;AAlFD,6CAAmD;AAiCnD,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAOlC,SAAS,mBAAmB,CAC1B,GAAW,EACX,KAAa,EACb,OAAe;IAEf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,KAAK,sBAAsB,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,uBAAuB,KAAK,IAAI,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,IAAA,sBAAQ,EACtB,QAAQ,EACR,GAAG,EACH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,EACJ,sBAAsB,CACvB,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAWD,SAAgB,iBAAiB,CAAC,IAKjC;IACC,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpE,OAAO,IAAA,wBAAU,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare const ENVELOPE_KEY_VERSION_V1: 1;
|
|
2
|
+
export interface EncryptedEnvelope {
|
|
3
|
+
readonly keyVersion: number;
|
|
4
|
+
readonly wrappedKey: Buffer;
|
|
5
|
+
readonly wrapIv: Buffer;
|
|
6
|
+
readonly wrapAuthTag: Buffer;
|
|
7
|
+
readonly contentIv: Buffer;
|
|
8
|
+
readonly contentAuthTag: Buffer;
|
|
9
|
+
readonly ciphertext: Buffer;
|
|
10
|
+
}
|
|
11
|
+
export declare enum EnvelopeEncryptionErrorCode {
|
|
12
|
+
MalformedKey = "MALFORMED_KEY",
|
|
13
|
+
MalformedEnvelope = "MALFORMED_ENVELOPE",
|
|
14
|
+
AuthenticationFailed = "AUTHENTICATION_FAILED"
|
|
15
|
+
}
|
|
16
|
+
export declare class EnvelopeEncryptionError extends Error {
|
|
17
|
+
readonly code: EnvelopeEncryptionErrorCode;
|
|
18
|
+
constructor(code: EnvelopeEncryptionErrorCode, message: string);
|
|
19
|
+
}
|
|
20
|
+
export declare function deriveOrgDataKey(kek: Buffer, orgId: string): Buffer;
|
|
21
|
+
export declare function kekFromHex(keyHex: string): Buffer;
|
|
22
|
+
export declare function sealEnvelope(dek: Buffer, plaintext: Buffer): EncryptedEnvelope;
|
|
23
|
+
export declare function openEnvelope(dek: Buffer, envelope: EncryptedEnvelope): Buffer;
|
|
24
|
+
export declare function serializeEnvelope(envelope: EncryptedEnvelope): Buffer;
|
|
25
|
+
export declare function isSerializedEnvelope(bytes: Buffer): boolean;
|
|
26
|
+
export declare function deserializeEnvelope(bytes: Buffer): EncryptedEnvelope;
|
|
27
|
+
export declare function encryptForOrg(kek: Buffer, orgId: string, plaintext: Buffer): Buffer;
|
|
28
|
+
export declare function decryptForOrg(kek: Buffer, orgId: string, bytes: Buffer): Buffer;
|
|
29
|
+
//# sourceMappingURL=envelope-encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope-encryption.d.ts","sourceRoot":"","sources":["../../src/lib/envelope-encryption.ts"],"names":[],"mappings":"AAoDA,eAAO,MAAM,uBAAuB,EAAG,CAAU,CAAC;AAOlD,MAAM,WAAW,iBAAiB;IAEhC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAGD,oBAAY,2BAA2B;IAErC,YAAY,kBAAkB;IAE9B,iBAAiB,uBAAuB;IAExC,oBAAoB,0BAA0B;CAC/C;AAMD,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;gBAE/B,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,MAAM;CAK/D;AAoCD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAcnE;AAQD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQjD;AAQD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAoC9E;AASD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,iBAAiB,GAC1B,MAAM,CAmDR;AAuBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAgCrE;AAGD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAM3D;AAMD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAwCpE;AAMD,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,CAGR;AAMD,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,MAAM,CAGR"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EnvelopeEncryptionError = exports.EnvelopeEncryptionErrorCode = exports.ENVELOPE_KEY_VERSION_V1 = void 0;
|
|
4
|
+
exports.deriveOrgDataKey = deriveOrgDataKey;
|
|
5
|
+
exports.kekFromHex = kekFromHex;
|
|
6
|
+
exports.sealEnvelope = sealEnvelope;
|
|
7
|
+
exports.openEnvelope = openEnvelope;
|
|
8
|
+
exports.serializeEnvelope = serializeEnvelope;
|
|
9
|
+
exports.isSerializedEnvelope = isSerializedEnvelope;
|
|
10
|
+
exports.deserializeEnvelope = deserializeEnvelope;
|
|
11
|
+
exports.encryptForOrg = encryptForOrg;
|
|
12
|
+
exports.decryptForOrg = decryptForOrg;
|
|
13
|
+
const node_crypto_1 = require("node:crypto");
|
|
14
|
+
const CONTENT_ALGORITHM = 'aes-256-gcm';
|
|
15
|
+
const KEY_WRAP_ALGORITHM = 'aes-256-gcm';
|
|
16
|
+
const GCM_IV_LENGTH = 12;
|
|
17
|
+
const KEY_LENGTH = 32;
|
|
18
|
+
const AUTH_TAG_LENGTH = 16;
|
|
19
|
+
exports.ENVELOPE_KEY_VERSION_V1 = 1;
|
|
20
|
+
var EnvelopeEncryptionErrorCode;
|
|
21
|
+
(function (EnvelopeEncryptionErrorCode) {
|
|
22
|
+
EnvelopeEncryptionErrorCode["MalformedKey"] = "MALFORMED_KEY";
|
|
23
|
+
EnvelopeEncryptionErrorCode["MalformedEnvelope"] = "MALFORMED_ENVELOPE";
|
|
24
|
+
EnvelopeEncryptionErrorCode["AuthenticationFailed"] = "AUTHENTICATION_FAILED";
|
|
25
|
+
})(EnvelopeEncryptionErrorCode || (exports.EnvelopeEncryptionErrorCode = EnvelopeEncryptionErrorCode = {}));
|
|
26
|
+
class EnvelopeEncryptionError extends Error {
|
|
27
|
+
code;
|
|
28
|
+
constructor(code, message) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = 'EnvelopeEncryptionError';
|
|
31
|
+
this.code = code;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.EnvelopeEncryptionError = EnvelopeEncryptionError;
|
|
35
|
+
function assertKey(key, label) {
|
|
36
|
+
if (!Buffer.isBuffer(key) || key.byteLength !== KEY_LENGTH) {
|
|
37
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.MalformedKey, `${label} must be a 32-byte Buffer (got ${Buffer.isBuffer(key) ? `${key.byteLength} bytes` : typeof key}).`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function deriveOrgDataKey(kek, orgId) {
|
|
41
|
+
assertKey(kek, 'KEK');
|
|
42
|
+
if (typeof orgId !== 'string' || orgId.length === 0) {
|
|
43
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.MalformedKey, 'deriveOrgDataKey: orgId must be a non-empty string.');
|
|
44
|
+
}
|
|
45
|
+
const info = Buffer.from(`xema:org-dek:v1:${orgId}`, 'utf8');
|
|
46
|
+
const derived = (0, node_crypto_1.hkdfSync)('sha256', kek, Buffer.alloc(0), info, KEY_LENGTH);
|
|
47
|
+
return Buffer.from(derived);
|
|
48
|
+
}
|
|
49
|
+
function kekFromHex(keyHex) {
|
|
50
|
+
if (typeof keyHex !== 'string' || !/^[0-9a-fA-F]{64}$/.test(keyHex)) {
|
|
51
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.MalformedKey, 'KEK must be a 64-character hex string (32 bytes).');
|
|
52
|
+
}
|
|
53
|
+
return Buffer.from(keyHex, 'hex');
|
|
54
|
+
}
|
|
55
|
+
function sealEnvelope(dek, plaintext) {
|
|
56
|
+
assertKey(dek, 'DEK');
|
|
57
|
+
if (!Buffer.isBuffer(plaintext)) {
|
|
58
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.MalformedEnvelope, 'sealEnvelope: plaintext must be a Buffer.');
|
|
59
|
+
}
|
|
60
|
+
const cek = (0, node_crypto_1.randomBytes)(KEY_LENGTH);
|
|
61
|
+
const contentIv = (0, node_crypto_1.randomBytes)(GCM_IV_LENGTH);
|
|
62
|
+
const contentCipher = (0, node_crypto_1.createCipheriv)(CONTENT_ALGORITHM, cek, contentIv);
|
|
63
|
+
const ciphertext = Buffer.concat([
|
|
64
|
+
contentCipher.update(plaintext),
|
|
65
|
+
contentCipher.final(),
|
|
66
|
+
]);
|
|
67
|
+
const contentAuthTag = contentCipher.getAuthTag();
|
|
68
|
+
const wrapIv = (0, node_crypto_1.randomBytes)(GCM_IV_LENGTH);
|
|
69
|
+
const wrapCipher = (0, node_crypto_1.createCipheriv)(KEY_WRAP_ALGORITHM, dek, wrapIv);
|
|
70
|
+
const wrappedKey = Buffer.concat([
|
|
71
|
+
wrapCipher.update(cek),
|
|
72
|
+
wrapCipher.final(),
|
|
73
|
+
]);
|
|
74
|
+
const wrapAuthTag = wrapCipher.getAuthTag();
|
|
75
|
+
return {
|
|
76
|
+
keyVersion: exports.ENVELOPE_KEY_VERSION_V1,
|
|
77
|
+
wrappedKey,
|
|
78
|
+
wrapIv,
|
|
79
|
+
wrapAuthTag,
|
|
80
|
+
contentIv,
|
|
81
|
+
contentAuthTag,
|
|
82
|
+
ciphertext,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function openEnvelope(dek, envelope) {
|
|
86
|
+
assertKey(dek, 'DEK');
|
|
87
|
+
if (envelope.keyVersion !== exports.ENVELOPE_KEY_VERSION_V1) {
|
|
88
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.MalformedEnvelope, `Unknown envelope keyVersion ${envelope.keyVersion}.`);
|
|
89
|
+
}
|
|
90
|
+
let cek;
|
|
91
|
+
try {
|
|
92
|
+
const wrapDecipher = (0, node_crypto_1.createDecipheriv)(KEY_WRAP_ALGORITHM, dek, envelope.wrapIv);
|
|
93
|
+
wrapDecipher.setAuthTag(envelope.wrapAuthTag);
|
|
94
|
+
cek = Buffer.concat([
|
|
95
|
+
wrapDecipher.update(envelope.wrappedKey),
|
|
96
|
+
wrapDecipher.final(),
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.AuthenticationFailed, 'Failed to unwrap content key — wrong DEK or tampered envelope.');
|
|
101
|
+
}
|
|
102
|
+
if (cek.byteLength !== KEY_LENGTH) {
|
|
103
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.MalformedEnvelope, 'Unwrapped content key has an invalid length.');
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const contentDecipher = (0, node_crypto_1.createDecipheriv)(CONTENT_ALGORITHM, cek, envelope.contentIv);
|
|
107
|
+
contentDecipher.setAuthTag(envelope.contentAuthTag);
|
|
108
|
+
return Buffer.concat([
|
|
109
|
+
contentDecipher.update(envelope.ciphertext),
|
|
110
|
+
contentDecipher.final(),
|
|
111
|
+
]);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.AuthenticationFailed, 'Failed to decrypt ciphertext — wrong content key or tampered envelope.');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const ENVELOPE_MAGIC = Buffer.from('XEV1', 'ascii');
|
|
118
|
+
function serializeEnvelope(envelope) {
|
|
119
|
+
if (envelope.wrapIv.byteLength !== GCM_IV_LENGTH ||
|
|
120
|
+
envelope.contentIv.byteLength !== GCM_IV_LENGTH ||
|
|
121
|
+
envelope.wrapAuthTag.byteLength !== AUTH_TAG_LENGTH ||
|
|
122
|
+
envelope.contentAuthTag.byteLength !== AUTH_TAG_LENGTH) {
|
|
123
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.MalformedEnvelope, 'serializeEnvelope: IV/authTag fields have unexpected lengths.');
|
|
124
|
+
}
|
|
125
|
+
if (envelope.wrappedKey.byteLength > 0xffff) {
|
|
126
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.MalformedEnvelope, 'serializeEnvelope: wrappedKey exceeds 65535 bytes.');
|
|
127
|
+
}
|
|
128
|
+
const keyVersionByte = Buffer.from([envelope.keyVersion & 0xff]);
|
|
129
|
+
const wrappedKeyLen = Buffer.alloc(2);
|
|
130
|
+
wrappedKeyLen.writeUInt16BE(envelope.wrappedKey.byteLength, 0);
|
|
131
|
+
return Buffer.concat([
|
|
132
|
+
ENVELOPE_MAGIC,
|
|
133
|
+
keyVersionByte,
|
|
134
|
+
envelope.wrapIv,
|
|
135
|
+
envelope.wrapAuthTag,
|
|
136
|
+
wrappedKeyLen,
|
|
137
|
+
envelope.wrappedKey,
|
|
138
|
+
envelope.contentIv,
|
|
139
|
+
envelope.contentAuthTag,
|
|
140
|
+
envelope.ciphertext,
|
|
141
|
+
]);
|
|
142
|
+
}
|
|
143
|
+
function isSerializedEnvelope(bytes) {
|
|
144
|
+
return (Buffer.isBuffer(bytes) &&
|
|
145
|
+
bytes.byteLength >= ENVELOPE_MAGIC.byteLength &&
|
|
146
|
+
bytes.subarray(0, ENVELOPE_MAGIC.byteLength).equals(ENVELOPE_MAGIC));
|
|
147
|
+
}
|
|
148
|
+
function deserializeEnvelope(bytes) {
|
|
149
|
+
if (!isSerializedEnvelope(bytes)) {
|
|
150
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.MalformedEnvelope, 'deserializeEnvelope: missing envelope magic prefix.');
|
|
151
|
+
}
|
|
152
|
+
let offset = ENVELOPE_MAGIC.byteLength;
|
|
153
|
+
const read = (length, label) => {
|
|
154
|
+
if (offset + length > bytes.byteLength) {
|
|
155
|
+
throw new EnvelopeEncryptionError(EnvelopeEncryptionErrorCode.MalformedEnvelope, `deserializeEnvelope: truncated before ${label}.`);
|
|
156
|
+
}
|
|
157
|
+
const slice = bytes.subarray(offset, offset + length);
|
|
158
|
+
offset += length;
|
|
159
|
+
return slice;
|
|
160
|
+
};
|
|
161
|
+
const keyVersion = read(1, 'keyVersion').readUInt8(0);
|
|
162
|
+
const wrapIv = read(GCM_IV_LENGTH, 'wrapIv');
|
|
163
|
+
const wrapAuthTag = read(AUTH_TAG_LENGTH, 'wrapAuthTag');
|
|
164
|
+
const wrappedKeyLen = read(2, 'wrappedKeyLen').readUInt16BE(0);
|
|
165
|
+
const wrappedKey = read(wrappedKeyLen, 'wrappedKey');
|
|
166
|
+
const contentIv = read(GCM_IV_LENGTH, 'contentIv');
|
|
167
|
+
const contentAuthTag = read(AUTH_TAG_LENGTH, 'contentAuthTag');
|
|
168
|
+
const ciphertext = bytes.subarray(offset);
|
|
169
|
+
return {
|
|
170
|
+
keyVersion,
|
|
171
|
+
wrappedKey: Buffer.from(wrappedKey),
|
|
172
|
+
wrapIv: Buffer.from(wrapIv),
|
|
173
|
+
wrapAuthTag: Buffer.from(wrapAuthTag),
|
|
174
|
+
contentIv: Buffer.from(contentIv),
|
|
175
|
+
contentAuthTag: Buffer.from(contentAuthTag),
|
|
176
|
+
ciphertext: Buffer.from(ciphertext),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function encryptForOrg(kek, orgId, plaintext) {
|
|
180
|
+
const dek = deriveOrgDataKey(kek, orgId);
|
|
181
|
+
return serializeEnvelope(sealEnvelope(dek, plaintext));
|
|
182
|
+
}
|
|
183
|
+
function decryptForOrg(kek, orgId, bytes) {
|
|
184
|
+
const dek = deriveOrgDataKey(kek, orgId);
|
|
185
|
+
return openEnvelope(dek, deserializeEnvelope(bytes));
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=envelope-encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope-encryption.js","sourceRoot":"","sources":["../../src/lib/envelope-encryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-actor.guard.d.ts","sourceRoot":"","sources":["../../../src/nestjs/auth/service-actor.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAKjB,MAAM,gBAAgB,CAAC;AAkCxB,qBACa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAE7D,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"service-actor.guard.d.ts","sourceRoot":"","sources":["../../../src/nestjs/auth/service-actor.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAKjB,MAAM,gBAAgB,CAAC;AAkCxB,qBACa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAE7D,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;CA2ChD"}
|
|
@@ -24,18 +24,19 @@ let ServiceActorGuard = ServiceActorGuard_1 = class ServiceActorGuard {
|
|
|
24
24
|
message: 'Internal route misconfigured: missing request context.',
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
|
-
|
|
27
|
+
const isDelegated = ctx.actorChain.length > 0;
|
|
28
|
+
if (ctx.tokenClass !== subject_1.TokenClass.ServiceJwt || isDelegated) {
|
|
28
29
|
this.logger.warn({
|
|
29
30
|
message: 'service-actor-required',
|
|
30
31
|
route: `${request.method} ${request.originalUrl}`,
|
|
31
32
|
actorId: ctx.actorId,
|
|
32
33
|
tokenClass: ctx.tokenClass,
|
|
33
34
|
subjectKind: ctx.subject.kind,
|
|
34
|
-
delegated:
|
|
35
|
+
delegated: isDelegated,
|
|
35
36
|
});
|
|
36
37
|
throw new common_1.ForbiddenException({
|
|
37
38
|
code: 'ACTOR_NOT_SERVICE',
|
|
38
|
-
message: 'This endpoint is restricted to service-account callers. ' +
|
|
39
|
+
message: 'This endpoint is restricted to non-delegated service-account callers. ' +
|
|
39
40
|
'Mint a token via IdentityBootstrapService.getAccessToken().',
|
|
40
41
|
});
|
|
41
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-actor.guard.js","sourceRoot":"","sources":["../../../src/nestjs/auth/service-actor.guard.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAOwB;AAExB,8DAA8D;AAC9D,+DAA4D;AAgCrD,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IACX,MAAM,GAAG,IAAI,eAAM,CAAC,mBAAiB,CAAC,IAAI,CAAC,CAAC;IAE7D,WAAW,CAAC,OAAyB;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAC7D,MAAM,GAAG,GAAI,OAA8C,CACzD,iCAAe,CACc,CAAC;QAEhC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,sDAAsD;gBACpD,4EAA4E,CAC/E,CAAC;YACF,MAAM,IAAI,qCAA4B,CAAC;gBACrC,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,wDAAwD;aAClE,CAAC,CAAC;QACL,CAAC;
|
|
1
|
+
{"version":3,"file":"service-actor.guard.js","sourceRoot":"","sources":["../../../src/nestjs/auth/service-actor.guard.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAOwB;AAExB,8DAA8D;AAC9D,+DAA4D;AAgCrD,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IACX,MAAM,GAAG,IAAI,eAAM,CAAC,mBAAiB,CAAC,IAAI,CAAC,CAAC;IAE7D,WAAW,CAAC,OAAyB;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAC7D,MAAM,GAAG,GAAI,OAA8C,CACzD,iCAAe,CACc,CAAC;QAEhC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,sDAAsD;gBACpD,4EAA4E,CAC/E,CAAC;YACF,MAAM,IAAI,qCAA4B,CAAC;gBACrC,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,wDAAwD;aAClE,CAAC,CAAC;QACL,CAAC;QAQD,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,UAAU,KAAK,oBAAU,CAAC,UAAU,IAAI,WAAW,EAAE,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,OAAO,EAAE,wBAAwB;gBACjC,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE;gBACjD,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;gBAC7B,SAAS,EAAE,WAAW;aACvB,CAAC,CAAC;YACH,MAAM,IAAI,2BAAkB,CAAC;gBAC3B,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EACL,wEAAwE;oBACxE,6DAA6D;aAChE,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA9CY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;GACA,iBAAiB,CA8C7B"}
|