mindoodb 0.0.50 → 0.0.53
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/README-server.md +11 -2
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +13 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +45 -20
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts +2 -0
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.js +6 -62
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +24 -0
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +75 -24
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/browser/index.mjs +72 -0
- package/dist/core/BaseMindooDB.d.ts +89 -14
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +692 -201
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +59 -7
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +427 -90
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +61 -9
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +363 -35
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/BaseMindooTenantFactory.d.ts +17 -1
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantFactory.js +292 -16
- package/dist/core/BaseMindooTenantFactory.js.map +1 -1
- package/dist/core/accesscontrol/DirectoryStateNode.d.ts +68 -1
- package/dist/core/accesscontrol/DirectoryStateNode.d.ts.map +1 -1
- package/dist/core/accesscontrol/DirectoryStateNode.js +157 -4
- package/dist/core/accesscontrol/DirectoryStateNode.js.map +1 -1
- package/dist/core/accesscontrol/directoryProjection.d.ts.map +1 -1
- package/dist/core/accesscontrol/directoryProjection.js +14 -5
- package/dist/core/accesscontrol/directoryProjection.js.map +1 -1
- package/dist/core/accesscontrol/grantKeys.d.ts +17 -14
- package/dist/core/accesscontrol/grantKeys.d.ts.map +1 -1
- package/dist/core/accesscontrol/grantKeys.js +51 -21
- package/dist/core/accesscontrol/grantKeys.js.map +1 -1
- package/dist/core/accesscontrol/types.d.ts +13 -7
- package/dist/core/accesscontrol/types.d.ts.map +1 -1
- package/dist/core/accesscontrol/types.js +16 -10
- package/dist/core/accesscontrol/types.js.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts +7 -0
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.js +70 -14
- package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
- package/dist/core/appendonlystores/network/entryWireCodec.d.ts +51 -0
- package/dist/core/appendonlystores/network/entryWireCodec.d.ts.map +1 -0
- package/dist/core/appendonlystores/network/entryWireCodec.js +93 -0
- package/dist/core/appendonlystores/network/entryWireCodec.js.map +1 -0
- package/dist/core/builtinDbInvariants.d.ts +53 -0
- package/dist/core/builtinDbInvariants.d.ts.map +1 -0
- package/dist/core/builtinDbInvariants.js +147 -0
- package/dist/core/builtinDbInvariants.js.map +1 -0
- package/dist/core/copy/feasibility.d.ts.map +1 -1
- package/dist/core/copy/feasibility.js +3 -0
- package/dist/core/copy/feasibility.js.map +1 -1
- package/dist/core/copy/flatten.d.ts.map +1 -1
- package/dist/core/copy/flatten.js +7 -2
- package/dist/core/copy/flatten.js.map +1 -1
- package/dist/core/copy/host.d.ts +5 -0
- package/dist/core/copy/host.d.ts.map +1 -1
- package/dist/core/copy/preflight.d.ts.map +1 -1
- package/dist/core/copy/preflight.js +7 -1
- package/dist/core/copy/preflight.js.map +1 -1
- package/dist/core/copy/types.d.ts +8 -1
- package/dist/core/copy/types.d.ts.map +1 -1
- package/dist/core/crypto/EntrySignature.d.ts +8 -2
- package/dist/core/crypto/EntrySignature.d.ts.map +1 -1
- package/dist/core/crypto/EntrySignature.js +14 -5
- package/dist/core/crypto/EntrySignature.js.map +1 -1
- package/dist/core/crypto/MindooDocSigner.d.ts.map +1 -1
- package/dist/core/crypto/MindooDocSigner.js +11 -2
- package/dist/core/crypto/MindooDocSigner.js.map +1 -1
- package/dist/core/crypto/RSAEncryption.d.ts +19 -0
- package/dist/core/crypto/RSAEncryption.d.ts.map +1 -1
- package/dist/core/crypto/RSAEncryption.js +36 -3
- package/dist/core/crypto/RSAEncryption.js.map +1 -1
- package/dist/core/crypto/privateKeyEncryption.js +1 -1
- package/dist/core/crypto/privateKeyEncryption.js.map +1 -1
- package/dist/core/crypto/rsaOaep3072.d.ts +12 -0
- package/dist/core/crypto/rsaOaep3072.d.ts.map +1 -0
- package/dist/core/crypto/rsaOaep3072.js +30 -0
- package/dist/core/crypto/rsaOaep3072.js.map +1 -0
- package/dist/core/databaseIdValidation.d.ts +23 -0
- package/dist/core/databaseIdValidation.d.ts.map +1 -1
- package/dist/core/databaseIdValidation.js +59 -1
- package/dist/core/databaseIdValidation.js.map +1 -1
- package/dist/core/index.d.ts +9 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +40 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/join/deviceJoinBootstrap.d.ts +23 -0
- package/dist/core/join/deviceJoinBootstrap.d.ts.map +1 -0
- package/dist/core/join/deviceJoinBootstrap.js +37 -0
- package/dist/core/join/deviceJoinBootstrap.js.map +1 -0
- package/dist/core/keys/KeyBag.d.ts +20 -2
- package/dist/core/keys/KeyBag.d.ts.map +1 -1
- package/dist/core/keys/KeyBag.js +22 -10
- package/dist/core/keys/KeyBag.js.map +1 -1
- package/dist/core/logging/MindooLogger.d.ts.map +1 -1
- package/dist/core/logging/MindooLogger.js +65 -40
- package/dist/core/logging/MindooLogger.js.map +1 -1
- package/dist/core/tenantIdValidation.d.ts.map +1 -1
- package/dist/core/tenantIdValidation.js +1 -1
- package/dist/core/tenantIdValidation.js.map +1 -1
- package/dist/core/tenantSetup.d.ts +109 -0
- package/dist/core/tenantSetup.d.ts.map +1 -0
- package/dist/core/tenantSetup.js +250 -0
- package/dist/core/tenantSetup.js.map +1 -0
- package/dist/core/types.d.ts +333 -43
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +27 -9
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/joinRequestUri.d.ts +37 -0
- package/dist/core/uri/joinRequestUri.d.ts.map +1 -0
- package/dist/core/uri/joinRequestUri.js +168 -0
- package/dist/core/uri/joinRequestUri.js.map +1 -0
- package/dist/core/userid/canonicalUsername.d.ts +66 -0
- package/dist/core/userid/canonicalUsername.d.ts.map +1 -0
- package/dist/core/userid/canonicalUsername.js +235 -0
- package/dist/core/userid/canonicalUsername.js.map +1 -0
- package/dist/core/userid/index.d.ts +9 -0
- package/dist/core/userid/index.d.ts.map +1 -1
- package/dist/core/userid/index.js +14 -0
- package/dist/core/userid/index.js.map +1 -1
- package/dist/core/userkeys/UserKeyDocument.d.ts +50 -0
- package/dist/core/userkeys/UserKeyDocument.d.ts.map +1 -0
- package/dist/core/userkeys/UserKeyDocument.js +145 -0
- package/dist/core/userkeys/UserKeyDocument.js.map +1 -0
- package/dist/core/userkeys/UserKeyManager.d.ts +170 -0
- package/dist/core/userkeys/UserKeyManager.d.ts.map +1 -0
- package/dist/core/userkeys/UserKeyManager.js +1277 -0
- package/dist/core/userkeys/UserKeyManager.js.map +1 -0
- package/dist/core/userkeys/fingerprint.d.ts +17 -0
- package/dist/core/userkeys/fingerprint.d.ts.map +1 -0
- package/dist/core/userkeys/fingerprint.js +59 -0
- package/dist/core/userkeys/fingerprint.js.map +1 -0
- package/dist/core/userkeys/index.d.ts +11 -0
- package/dist/core/userkeys/index.d.ts.map +1 -0
- package/dist/core/userkeys/index.js +49 -0
- package/dist/core/userkeys/index.js.map +1 -0
- package/dist/core/userkeys/recipients.d.ts +51 -0
- package/dist/core/userkeys/recipients.d.ts.map +1 -0
- package/dist/core/userkeys/recipients.js +292 -0
- package/dist/core/userkeys/recipients.js.map +1 -0
- package/dist/core/userkeys/resolveUserKeyDocument.d.ts +21 -0
- package/dist/core/userkeys/resolveUserKeyDocument.d.ts.map +1 -0
- package/dist/core/userkeys/resolveUserKeyDocument.js +98 -0
- package/dist/core/userkeys/resolveUserKeyDocument.js.map +1 -0
- package/dist/core/userkeys/sealedCrypto.d.ts +21 -0
- package/dist/core/userkeys/sealedCrypto.d.ts.map +1 -0
- package/dist/core/userkeys/sealedCrypto.js +79 -0
- package/dist/core/userkeys/sealedCrypto.js.map +1 -0
- package/dist/core/userkeys/sealedTypes.d.ts +72 -0
- package/dist/core/userkeys/sealedTypes.d.ts.map +1 -0
- package/dist/core/userkeys/sealedTypes.js +14 -0
- package/dist/core/userkeys/sealedTypes.js.map +1 -0
- package/dist/core/userkeys/types.d.ts +70 -0
- package/dist/core/userkeys/types.d.ts.map +1 -0
- package/dist/core/userkeys/types.js +48 -0
- package/dist/core/userkeys/types.js.map +1 -0
- package/dist/core/userkeys/validateUserKeyDocument.d.ts +19 -0
- package/dist/core/userkeys/validateUserKeyDocument.d.ts.map +1 -0
- package/dist/core/userkeys/validateUserKeyDocument.js +42 -0
- package/dist/core/userkeys/validateUserKeyDocument.js.map +1 -0
- package/dist/core/utils/idGeneration.d.ts +39 -20
- package/dist/core/utils/idGeneration.d.ts.map +1 -1
- package/dist/core/utils/idGeneration.js +82 -62
- package/dist/core/utils/idGeneration.js.map +1 -1
- package/dist/core/utils/index.d.ts +1 -1
- package/dist/core/utils/index.d.ts.map +1 -1
- package/dist/core/utils/index.js +4 -1
- package/dist/core/utils/index.js.map +1 -1
- package/dist/node/server/CapabilityMatcher.d.ts +5 -0
- package/dist/node/server/CapabilityMatcher.d.ts.map +1 -1
- package/dist/node/server/CapabilityMatcher.js +10 -1
- package/dist/node/server/CapabilityMatcher.js.map +1 -1
- package/dist/node/server/DeviceDiscoveryService.d.ts +36 -0
- package/dist/node/server/DeviceDiscoveryService.d.ts.map +1 -0
- package/dist/node/server/DeviceDiscoveryService.js +165 -0
- package/dist/node/server/DeviceDiscoveryService.js.map +1 -0
- package/dist/node/server/MindooDBServer.d.ts +13 -0
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +99 -61
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/SystemAdminAuth.d.ts +7 -0
- package/dist/node/server/SystemAdminAuth.d.ts.map +1 -1
- package/dist/node/server/SystemAdminAuth.js +4 -1
- package/dist/node/server/SystemAdminAuth.js.map +1 -1
- package/dist/node/server/TenantManager.d.ts +29 -0
- package/dist/node/server/TenantManager.d.ts.map +1 -1
- package/dist/node/server/TenantManager.js +146 -7
- package/dist/node/server/TenantManager.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipients.js","sourceRoot":"","sources":["../../../src/core/userkeys/recipients.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MindooDB, MindooDoc, MindooTenantDirectory } from "../types";
|
|
2
|
+
import { type UserKeyDocumentPayload } from "./types";
|
|
3
|
+
export interface ResolveUserKeyDocumentInput {
|
|
4
|
+
db: MindooDB;
|
|
5
|
+
directory: MindooTenantDirectory;
|
|
6
|
+
username: string;
|
|
7
|
+
usernameHashCandidates: string[];
|
|
8
|
+
grantDocIds: string[];
|
|
9
|
+
adminPublicKey?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ResolvedUserKeyDocument {
|
|
12
|
+
doc: MindooDoc;
|
|
13
|
+
payload: UserKeyDocumentPayload;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* §5.1 lookup: canonical `userkey_<grantDocId>` first, then a scan over
|
|
17
|
+
* `username_hash`. Invalid squatters are ignored. Ties break by highest
|
|
18
|
+
* epoch, then lowest fingerprint (byte-deterministic).
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveUserKeyDocument(input: ResolveUserKeyDocumentInput): Promise<ResolvedUserKeyDocument | null>;
|
|
21
|
+
//# sourceMappingURL=resolveUserKeyDocument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveUserKeyDocument.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/resolveUserKeyDocument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAqB,KAAK,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAGzE,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,QAAQ,CAAC;IACb,SAAS,EAAE,qBAAqB,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAiCzC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveUserKeyDocument = resolveUserKeyDocument;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
const validateUserKeyDocument_1 = require("./validateUserKeyDocument");
|
|
6
|
+
/**
|
|
7
|
+
* §5.1 lookup: canonical `userkey_<grantDocId>` first, then a scan over
|
|
8
|
+
* `username_hash`. Invalid squatters are ignored. Ties break by highest
|
|
9
|
+
* epoch, then lowest fingerprint (byte-deterministic).
|
|
10
|
+
*/
|
|
11
|
+
async function resolveUserKeyDocument(input) {
|
|
12
|
+
const valid = [];
|
|
13
|
+
for (const grantDocId of input.grantDocIds) {
|
|
14
|
+
const canonicalId = (0, types_1.userKeyDocumentId)(grantDocId);
|
|
15
|
+
try {
|
|
16
|
+
const doc = await input.db.getDocument(canonicalId);
|
|
17
|
+
if (doc.isDeleted())
|
|
18
|
+
continue;
|
|
19
|
+
const resolved = await validateLoaded(doc, input);
|
|
20
|
+
if (resolved)
|
|
21
|
+
valid.push(resolved);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// missing or unreadable
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (valid.length === 0) {
|
|
28
|
+
const ids = await input.db.getAllDocumentIds();
|
|
29
|
+
for (const id of ids) {
|
|
30
|
+
if (valid.some((v) => v.doc.getId() === id))
|
|
31
|
+
continue;
|
|
32
|
+
try {
|
|
33
|
+
const doc = await input.db.getDocument(id);
|
|
34
|
+
if (doc.isDeleted())
|
|
35
|
+
continue;
|
|
36
|
+
const resolved = await validateLoaded(doc, input);
|
|
37
|
+
if (resolved)
|
|
38
|
+
valid.push(resolved);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// skip
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (valid.length === 0)
|
|
46
|
+
return null;
|
|
47
|
+
valid.sort(compareResolved);
|
|
48
|
+
return valid[0];
|
|
49
|
+
}
|
|
50
|
+
async function validateLoaded(doc, input) {
|
|
51
|
+
const signerKey = await creatorSigningKey(input.db, doc.getId());
|
|
52
|
+
if (!signerKey)
|
|
53
|
+
return null;
|
|
54
|
+
const payload = await (0, validateUserKeyDocument_1.validateUserKeyDocument)({
|
|
55
|
+
payload: doc.getData(),
|
|
56
|
+
signerKey,
|
|
57
|
+
usernameHashCandidates: input.usernameHashCandidates,
|
|
58
|
+
directory: input.directory,
|
|
59
|
+
adminPublicKey: input.adminPublicKey,
|
|
60
|
+
});
|
|
61
|
+
if (!payload)
|
|
62
|
+
return null;
|
|
63
|
+
return { doc, payload };
|
|
64
|
+
}
|
|
65
|
+
async function creatorSigningKey(db, docId) {
|
|
66
|
+
const store = db.getStore();
|
|
67
|
+
const metas = await store.findNewEntriesForDoc([], docId);
|
|
68
|
+
const create = metas.find((m) => m.entryType === "doc_create");
|
|
69
|
+
return create?.createdByPublicKey ?? null;
|
|
70
|
+
}
|
|
71
|
+
function compareResolved(a, b) {
|
|
72
|
+
const epochA = maxEpoch(a.payload);
|
|
73
|
+
const epochB = maxEpoch(b.payload);
|
|
74
|
+
if (epochA !== epochB)
|
|
75
|
+
return epochB > epochA ? 1 : -1;
|
|
76
|
+
const fpA = currentFingerprint(a.payload);
|
|
77
|
+
const fpB = currentFingerprint(b.payload);
|
|
78
|
+
if (fpA !== fpB)
|
|
79
|
+
return fpA < fpB ? -1 : 1;
|
|
80
|
+
return a.doc.getId() < b.doc.getId() ? -1 : 1;
|
|
81
|
+
}
|
|
82
|
+
function maxEpoch(payload) {
|
|
83
|
+
const epochs = Object.keys(payload.userKeys ?? {}).filter((k) => /^\d+$/.test(k));
|
|
84
|
+
if (epochs.length === 0)
|
|
85
|
+
return 0n;
|
|
86
|
+
return epochs.reduce((acc, k) => {
|
|
87
|
+
const n = BigInt(k);
|
|
88
|
+
return n > acc ? n : acc;
|
|
89
|
+
}, 0n);
|
|
90
|
+
}
|
|
91
|
+
function currentFingerprint(payload) {
|
|
92
|
+
const epochs = Object.keys(payload.userKeys ?? {}).filter((k) => /^\d+$/.test(k));
|
|
93
|
+
if (epochs.length === 0)
|
|
94
|
+
return "";
|
|
95
|
+
const current = epochs.reduce((a, b) => (BigInt(a) > BigInt(b) ? a : b));
|
|
96
|
+
return payload.userKeys[current]?.fingerprint ?? "";
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=resolveUserKeyDocument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveUserKeyDocument.js","sourceRoot":"","sources":["../../../src/core/userkeys/resolveUserKeyDocument.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CryptoAdapter } from "../crypto/CryptoAdapter";
|
|
2
|
+
import type { EntryRecipients } from "./sealedTypes";
|
|
3
|
+
export declare function encryptAesGcm(crypto: CryptoAdapter, keyBytes: Uint8Array, plaintext: Uint8Array): Promise<Uint8Array>;
|
|
4
|
+
export declare function decryptAesGcm(crypto: CryptoAdapter, keyBytes: Uint8Array, packed: Uint8Array): Promise<Uint8Array>;
|
|
5
|
+
export declare function concatGenerations(generations: Uint8Array[]): Uint8Array;
|
|
6
|
+
export declare function splitGenerations(bytes: Uint8Array): Uint8Array[];
|
|
7
|
+
export declare function sealBundle(input: {
|
|
8
|
+
crypto: CryptoAdapter;
|
|
9
|
+
generations: Uint8Array[];
|
|
10
|
+
wrapsTo: Array<{
|
|
11
|
+
kind: "user" | "device";
|
|
12
|
+
fingerprint: string;
|
|
13
|
+
publicKeyPem: string;
|
|
14
|
+
}>;
|
|
15
|
+
}): Promise<EntryRecipients>;
|
|
16
|
+
export declare function openBundle(input: {
|
|
17
|
+
crypto: CryptoAdapter;
|
|
18
|
+
recipients: EntryRecipients;
|
|
19
|
+
privateKey: CryptoKey;
|
|
20
|
+
}): Promise<Uint8Array[]>;
|
|
21
|
+
//# sourceMappingURL=sealedCrypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sealedCrypto.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/sealedCrypto.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,UAAU,CAAC,CAerB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,UAAU,CAAC,CAarB;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,CAIvE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,CAMhE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxF,GAAG,OAAO,CAAC,eAAe,CAAC,CAkB3B;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,SAAS,CAAC;CACvB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAaxB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.encryptAesGcm = encryptAesGcm;
|
|
4
|
+
exports.decryptAesGcm = decryptAesGcm;
|
|
5
|
+
exports.concatGenerations = concatGenerations;
|
|
6
|
+
exports.splitGenerations = splitGenerations;
|
|
7
|
+
exports.sealBundle = sealBundle;
|
|
8
|
+
exports.openBundle = openBundle;
|
|
9
|
+
const RSAEncryption_1 = require("../crypto/RSAEncryption");
|
|
10
|
+
const fingerprint_1 = require("./fingerprint");
|
|
11
|
+
async function encryptAesGcm(crypto, keyBytes, plaintext) {
|
|
12
|
+
const subtle = crypto.getSubtle();
|
|
13
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
14
|
+
const key = await subtle.importKey("raw", keyBytes.slice(), { name: "AES-GCM" }, false, [
|
|
15
|
+
"encrypt",
|
|
16
|
+
]);
|
|
17
|
+
const ct = await subtle.encrypt({ name: "AES-GCM", iv: iv.slice(), tagLength: 128 }, key, plaintext.slice());
|
|
18
|
+
const out = new Uint8Array(12 + ct.byteLength);
|
|
19
|
+
out.set(iv, 0);
|
|
20
|
+
out.set(new Uint8Array(ct), 12);
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
async function decryptAesGcm(crypto, keyBytes, packed) {
|
|
24
|
+
const subtle = crypto.getSubtle();
|
|
25
|
+
const iv = packed.slice(0, 12);
|
|
26
|
+
const ct = packed.slice(12);
|
|
27
|
+
const key = await subtle.importKey("raw", keyBytes.slice(), { name: "AES-GCM" }, false, [
|
|
28
|
+
"decrypt",
|
|
29
|
+
]);
|
|
30
|
+
const pt = await subtle.decrypt({ name: "AES-GCM", iv: iv, tagLength: 128 }, key, ct);
|
|
31
|
+
return new Uint8Array(pt);
|
|
32
|
+
}
|
|
33
|
+
function concatGenerations(generations) {
|
|
34
|
+
const out = new Uint8Array(generations.length * 32);
|
|
35
|
+
generations.forEach((g, i) => out.set(g, i * 32));
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
function splitGenerations(bytes) {
|
|
39
|
+
const gens = [];
|
|
40
|
+
for (let i = 0; i + 32 <= bytes.length; i += 32) {
|
|
41
|
+
gens.push(bytes.slice(i, i + 32));
|
|
42
|
+
}
|
|
43
|
+
return gens;
|
|
44
|
+
}
|
|
45
|
+
async function sealBundle(input) {
|
|
46
|
+
const bundleKey = input.crypto.getRandomValues(new Uint8Array(32));
|
|
47
|
+
const bundle = await encryptAesGcm(input.crypto, bundleKey, concatGenerations(input.generations));
|
|
48
|
+
const rsa = new RSAEncryption_1.RSAEncryption(input.crypto);
|
|
49
|
+
const wraps = [];
|
|
50
|
+
for (const target of input.wrapsTo) {
|
|
51
|
+
const wrapped = await rsa.encrypt(bundleKey, target.publicKeyPem);
|
|
52
|
+
wraps.push({
|
|
53
|
+
kind: target.kind,
|
|
54
|
+
keyFingerprint: target.fingerprint,
|
|
55
|
+
wrapped: (0, fingerprint_1.bytesToBase64)(wrapped),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
epoch: input.generations.length,
|
|
60
|
+
bundle: (0, fingerprint_1.bytesToBase64)(bundle),
|
|
61
|
+
wraps,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async function openBundle(input) {
|
|
65
|
+
const rsa = new RSAEncryption_1.RSAEncryption(input.crypto);
|
|
66
|
+
let lastError;
|
|
67
|
+
for (const wrap of input.recipients.wraps) {
|
|
68
|
+
try {
|
|
69
|
+
const bundleKey = await rsa.decrypt((0, fingerprint_1.base64ToBytes)(wrap.wrapped), input.privateKey);
|
|
70
|
+
const packed = await decryptAesGcm(input.crypto, bundleKey, (0, fingerprint_1.base64ToBytes)(input.recipients.bundle));
|
|
71
|
+
return splitGenerations(packed).reverse();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
lastError = error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
throw lastError ?? new Error("no recipient wrap opened");
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=sealedCrypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sealedCrypto.js","sourceRoot":"","sources":["../../../src/core/userkeys/sealedCrypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export declare const SEALED_KEY_PREFIX = "$sealed:";
|
|
2
|
+
export declare const ENCRYPT_FOR_FIELD = "_encryptFor";
|
|
3
|
+
export declare function sealedKeyId(docId: string): string;
|
|
4
|
+
export declare function isSealedKeyId(keyId: string): boolean;
|
|
5
|
+
export type RecipientSpec = string | {
|
|
6
|
+
user: string;
|
|
7
|
+
} | {
|
|
8
|
+
device: string;
|
|
9
|
+
label?: string;
|
|
10
|
+
} | {
|
|
11
|
+
devicePem: string;
|
|
12
|
+
label: string;
|
|
13
|
+
};
|
|
14
|
+
export interface RecipientOptions {
|
|
15
|
+
includeSelf?: boolean;
|
|
16
|
+
strict?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface EncryptForEntry {
|
|
19
|
+
kind: "user" | "device";
|
|
20
|
+
label?: string;
|
|
21
|
+
addedAt: number;
|
|
22
|
+
addedBy: string;
|
|
23
|
+
/** Fingerprint of the public key wrapped to; used for `sealed` on the handle. */
|
|
24
|
+
keyFingerprint?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Legacy field from when recipients could be expanded from a directory group.
|
|
27
|
+
* No longer written. Still read so older documents keep their payload shape.
|
|
28
|
+
*/
|
|
29
|
+
viaGroup?: string;
|
|
30
|
+
removedAt?: number;
|
|
31
|
+
removedBy?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface RecipientChangeOptions {
|
|
34
|
+
signingKeyPair?: import("../types").SigningKeyPair;
|
|
35
|
+
signingKeyPassword?: string;
|
|
36
|
+
bypassAccessControlPrecheck?: boolean;
|
|
37
|
+
change?: (doc: import("../types").MindooDoc) => void | Promise<void>;
|
|
38
|
+
strict?: boolean;
|
|
39
|
+
/** When setting the list, also keep the caller (default true). */
|
|
40
|
+
includeSelf?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface ResolvedRecipient {
|
|
43
|
+
kind: "user" | "device";
|
|
44
|
+
id: string;
|
|
45
|
+
keyFingerprint: string;
|
|
46
|
+
label?: string;
|
|
47
|
+
addedInEpoch: number;
|
|
48
|
+
sealed: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface EntryRecipientWrap {
|
|
51
|
+
kind: "user" | "device";
|
|
52
|
+
keyFingerprint: string;
|
|
53
|
+
wrapped: string;
|
|
54
|
+
}
|
|
55
|
+
export interface EntryRecipients {
|
|
56
|
+
epoch: number;
|
|
57
|
+
bundle: string;
|
|
58
|
+
wraps: EntryRecipientWrap[];
|
|
59
|
+
namesEncrypted?: string;
|
|
60
|
+
}
|
|
61
|
+
export interface RecipientChangeResult {
|
|
62
|
+
epoch: number;
|
|
63
|
+
rotated: boolean;
|
|
64
|
+
added: ResolvedRecipient[];
|
|
65
|
+
removed: ResolvedRecipient[];
|
|
66
|
+
skipped: Array<{
|
|
67
|
+
spec: RecipientSpec;
|
|
68
|
+
reason: string;
|
|
69
|
+
}>;
|
|
70
|
+
entryId: string;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=sealedTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sealedTypes.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/sealedTypes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAC5C,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,MAAM,MAAM,aAAa,GACrB,MAAM,GACN;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,OAAO,UAAU,EAAE,cAAc,CAAC;IACnD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ENCRYPT_FOR_FIELD = exports.SEALED_KEY_PREFIX = void 0;
|
|
4
|
+
exports.sealedKeyId = sealedKeyId;
|
|
5
|
+
exports.isSealedKeyId = isSealedKeyId;
|
|
6
|
+
exports.SEALED_KEY_PREFIX = "$sealed:";
|
|
7
|
+
exports.ENCRYPT_FOR_FIELD = "_encryptFor";
|
|
8
|
+
function sealedKeyId(docId) {
|
|
9
|
+
return `${exports.SEALED_KEY_PREFIX}${docId}`;
|
|
10
|
+
}
|
|
11
|
+
function isSealedKeyId(keyId) {
|
|
12
|
+
return keyId.startsWith(exports.SEALED_KEY_PREFIX);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=sealedTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sealedTypes.js","sourceRoot":"","sources":["../../../src/core/userkeys/sealedTypes.ts"],"names":[],"mappings":";;;AAGA,kCAEC;AAED,sCAEC;AATY,QAAA,iBAAiB,GAAG,UAAU,CAAC;AAC/B,QAAA,iBAAiB,GAAG,aAAa,CAAC;AAE/C,SAAgB,WAAW,CAAC,KAAa;IACvC,OAAO,GAAG,yBAAiB,GAAG,KAAK,EAAE,CAAC;AACxC,CAAC;AAED,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,UAAU,CAAC,yBAAiB,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export declare const USERKEY_FORM = "userdirectory";
|
|
2
|
+
export declare const USERKEY_TYPE = "userkey";
|
|
3
|
+
export declare const USERKEY_SCHEMA_VERSION = 1;
|
|
4
|
+
export declare const USERKEY_DOC_ID_PREFIX = "userkey_";
|
|
5
|
+
export declare const USERKEY_PRIVATE_SALT = "userkey";
|
|
6
|
+
/** Matches `BaseMindooTenantDirectory.USERNAME_HASH_VERSION` (write version 3). */
|
|
7
|
+
export declare const USERKEY_USERNAME_HASH_VERSION = 3;
|
|
8
|
+
export type UserKeyWaitState = "approved" | "waiting" | "unknown";
|
|
9
|
+
export interface PendingUserKeyDevice {
|
|
10
|
+
fingerprint: string;
|
|
11
|
+
signingPublicKey: string;
|
|
12
|
+
encryptionPublicKey: string;
|
|
13
|
+
label?: string;
|
|
14
|
+
addedAt?: number;
|
|
15
|
+
}
|
|
16
|
+
export type UserKeyDeviceStatus = "approved" | "pending" | "declined";
|
|
17
|
+
export interface UserKeyDeviceRow {
|
|
18
|
+
fingerprint: string;
|
|
19
|
+
signingPublicKey?: string;
|
|
20
|
+
encryptionPublicKey?: string;
|
|
21
|
+
label?: string;
|
|
22
|
+
addedAt?: number;
|
|
23
|
+
status: UserKeyDeviceStatus;
|
|
24
|
+
}
|
|
25
|
+
export interface UserKeyEnrollmentStatus {
|
|
26
|
+
state: UserKeyWaitState;
|
|
27
|
+
/** True while the published document has no person-written wrap. */
|
|
28
|
+
pending: boolean;
|
|
29
|
+
missingKeys: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare function userKeyDocumentId(grantDocId: string): string;
|
|
32
|
+
export interface UserKeyDeviceWrap {
|
|
33
|
+
wrappedKey: string;
|
|
34
|
+
label?: string;
|
|
35
|
+
approvedAt: number;
|
|
36
|
+
approvedBySigningPublicKey: string;
|
|
37
|
+
}
|
|
38
|
+
export interface UserKeyGeneration {
|
|
39
|
+
publicKey: string;
|
|
40
|
+
fingerprint: string;
|
|
41
|
+
createdAt: number;
|
|
42
|
+
retiredAt?: number;
|
|
43
|
+
deviceWraps: Record<string, UserKeyDeviceWrap>;
|
|
44
|
+
}
|
|
45
|
+
export interface RejectedUserKeyDevice {
|
|
46
|
+
signingPublicKey?: string;
|
|
47
|
+
rejectedAt: number;
|
|
48
|
+
rejectedBySigningPublicKey: string;
|
|
49
|
+
}
|
|
50
|
+
export interface UserKeyDocumentPayload {
|
|
51
|
+
form: typeof USERKEY_FORM;
|
|
52
|
+
type: typeof USERKEY_TYPE;
|
|
53
|
+
schemaVersion: number;
|
|
54
|
+
username_hash: string;
|
|
55
|
+
username_hash_v: number;
|
|
56
|
+
userKeys: Record<string, UserKeyGeneration>;
|
|
57
|
+
rejectedDevices?: Record<string, RejectedUserKeyDevice>;
|
|
58
|
+
}
|
|
59
|
+
export declare function currentUserKeyEpoch(payload: UserKeyDocumentPayload): string | null;
|
|
60
|
+
export declare function isPendingUserKeyDocument(payload: UserKeyDocumentPayload): boolean;
|
|
61
|
+
export declare class UserKeyMismatchError extends Error {
|
|
62
|
+
readonly name = "UserKeyMismatchError";
|
|
63
|
+
constructor(message?: string);
|
|
64
|
+
}
|
|
65
|
+
/** Identity already has a User-Key that this session cannot open. */
|
|
66
|
+
export declare class UserKeyDecryptError extends Error {
|
|
67
|
+
readonly name = "UserKeyDecryptError";
|
|
68
|
+
constructor(message?: string);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/types.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAC5C,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAChD,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,mFAAmF;AACnF,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,gBAAgB,CAAC;IACxB,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,YAAY,CAAC;IAC1B,IAAI,EAAE,OAAO,YAAY,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACzD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI,CAIlF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAIjF;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,0BAA0B;gBAErC,OAAO,SAA2E;CAIrF;AAED,qEAAqE;AACrE,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,yBAAyB;gBAEpC,OAAO,SAAiK;CAI3K"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserKeyDecryptError = exports.UserKeyMismatchError = exports.USERKEY_USERNAME_HASH_VERSION = exports.USERKEY_PRIVATE_SALT = exports.USERKEY_DOC_ID_PREFIX = exports.USERKEY_SCHEMA_VERSION = exports.USERKEY_TYPE = exports.USERKEY_FORM = void 0;
|
|
4
|
+
exports.userKeyDocumentId = userKeyDocumentId;
|
|
5
|
+
exports.currentUserKeyEpoch = currentUserKeyEpoch;
|
|
6
|
+
exports.isPendingUserKeyDocument = isPendingUserKeyDocument;
|
|
7
|
+
const types_1 = require("../accesscontrol/types");
|
|
8
|
+
exports.USERKEY_FORM = "userdirectory";
|
|
9
|
+
exports.USERKEY_TYPE = "userkey";
|
|
10
|
+
exports.USERKEY_SCHEMA_VERSION = 1;
|
|
11
|
+
exports.USERKEY_DOC_ID_PREFIX = "userkey_";
|
|
12
|
+
exports.USERKEY_PRIVATE_SALT = "userkey";
|
|
13
|
+
/** Matches `BaseMindooTenantDirectory.USERNAME_HASH_VERSION` (write version 3). */
|
|
14
|
+
exports.USERKEY_USERNAME_HASH_VERSION = 3;
|
|
15
|
+
function userKeyDocumentId(grantDocId) {
|
|
16
|
+
// Grant ids used to be mixed-case (e.g. `033p0Fh2PNGwn0yTqWp7UE`). Custom
|
|
17
|
+
// document ids may only be `^[a-z][a-z0-9_]*$`. Encode like ACL ids so
|
|
18
|
+
// MongoDB hex object ids pass through unchanged and legacy ids stay valid.
|
|
19
|
+
return `${exports.USERKEY_DOC_ID_PREFIX}${(0, types_1.encodeAclIdComponent)(grantDocId)}`;
|
|
20
|
+
}
|
|
21
|
+
function currentUserKeyEpoch(payload) {
|
|
22
|
+
const epochs = Object.keys(payload.userKeys ?? {}).filter((k) => /^\d+$/.test(k));
|
|
23
|
+
if (epochs.length === 0)
|
|
24
|
+
return null;
|
|
25
|
+
return epochs.reduce((a, b) => (BigInt(a) > BigInt(b) ? a : b));
|
|
26
|
+
}
|
|
27
|
+
function isPendingUserKeyDocument(payload) {
|
|
28
|
+
const epochs = Object.values(payload.userKeys ?? {});
|
|
29
|
+
if (epochs.length === 0)
|
|
30
|
+
return true;
|
|
31
|
+
return epochs.every((gen) => Object.keys(gen.deviceWraps ?? {}).length === 0);
|
|
32
|
+
}
|
|
33
|
+
class UserKeyMismatchError extends Error {
|
|
34
|
+
constructor(message = "Published user public key does not match the key this device generated") {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = "UserKeyMismatchError";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.UserKeyMismatchError = UserKeyMismatchError;
|
|
40
|
+
/** Identity already has a User-Key that this session cannot open. */
|
|
41
|
+
class UserKeyDecryptError extends Error {
|
|
42
|
+
constructor(message = "Local User-Key exists but cannot be decrypted with the current password. Refusing to generate a second pair (that would desync acl_keydistribution_default).") {
|
|
43
|
+
super(message);
|
|
44
|
+
this.name = "UserKeyDecryptError";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.UserKeyDecryptError = UserKeyDecryptError;
|
|
48
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/userkeys/types.ts"],"names":[],"mappings":";;;AAsCA,8CAKC;AAiCD,kDAIC;AAED,4DAIC;AAtFD,kDAA8D;AAEjD,QAAA,YAAY,GAAG,eAAe,CAAC;AAC/B,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,qBAAqB,GAAG,UAAU,CAAC;AACnC,QAAA,oBAAoB,GAAG,SAAS,CAAC;AAC9C,mFAAmF;AACtE,QAAA,6BAA6B,GAAG,CAAC,CAAC;AA8B/C,SAAgB,iBAAiB,CAAC,UAAkB;IAClD,0EAA0E;IAC1E,uEAAuE;IACvE,2EAA2E;IAC3E,OAAO,GAAG,6BAAqB,GAAG,IAAA,4BAAoB,EAAC,UAAU,CAAC,EAAE,CAAC;AACvE,CAAC;AAiCD,SAAgB,mBAAmB,CAAC,OAA+B;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,wBAAwB,CAAC,OAA+B;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAE7C,YACE,OAAO,GAAG,wEAAwE;QAElF,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,SAAI,GAAG,sBAAsB,CAAC;IAKvC,CAAC;CACF;AAPD,oDAOC;AAED,qEAAqE;AACrE,MAAa,mBAAoB,SAAQ,KAAK;IAE5C,YACE,OAAO,GAAG,8JAA8J;QAExK,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,SAAI,GAAG,qBAAqB,CAAC;IAKtC,CAAC;CACF;AAPD,kDAOC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MindooTenantDirectory } from "../types";
|
|
2
|
+
import { type UserKeyDocumentPayload } from "./types";
|
|
3
|
+
export interface ValidateUserKeyInput {
|
|
4
|
+
payload: unknown;
|
|
5
|
+
/** Signing public key of the `doc_create` entry (or of the change being judged). */
|
|
6
|
+
signerKey: string;
|
|
7
|
+
usernameHashCandidates: string[];
|
|
8
|
+
directory: MindooTenantDirectory;
|
|
9
|
+
/** Admin create of a pending document is valid even though the signer is not the person. */
|
|
10
|
+
adminPublicKey?: string;
|
|
11
|
+
trustedTime?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* §6.4 binding: the payload has the userkey shape, `username_hash` matches
|
|
15
|
+
* the person, and the create signer is either that person or the tenant admin.
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateUserKeyDocument(input: ValidateUserKeyInput): Promise<UserKeyDocumentPayload | null>;
|
|
18
|
+
export declare function asUserKeyPayload(payload: unknown): UserKeyDocumentPayload | null;
|
|
19
|
+
//# sourceMappingURL=validateUserKeyDocument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateUserKeyDocument.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/validateUserKeyDocument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,qBAAqB,CAAC;IACjC,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAoBxC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAShF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateUserKeyDocument = validateUserKeyDocument;
|
|
4
|
+
exports.asUserKeyPayload = asUserKeyPayload;
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
/**
|
|
7
|
+
* §6.4 binding: the payload has the userkey shape, `username_hash` matches
|
|
8
|
+
* the person, and the create signer is either that person or the tenant admin.
|
|
9
|
+
*/
|
|
10
|
+
async function validateUserKeyDocument(input) {
|
|
11
|
+
const payload = asUserKeyPayload(input.payload);
|
|
12
|
+
if (!payload)
|
|
13
|
+
return null;
|
|
14
|
+
if (!input.usernameHashCandidates.includes(payload.username_hash)) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
if (input.adminPublicKey && input.signerKey === input.adminPublicKey) {
|
|
18
|
+
return payload;
|
|
19
|
+
}
|
|
20
|
+
if (typeof input.directory.resolveUsernameHashForSigningKey !== "function") {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const signerHash = await input.directory.resolveUsernameHashForSigningKey(input.signerKey, input.trustedTime ?? Number.MAX_SAFE_INTEGER);
|
|
24
|
+
if (!signerHash || signerHash !== payload.username_hash) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return payload;
|
|
28
|
+
}
|
|
29
|
+
function asUserKeyPayload(payload) {
|
|
30
|
+
if (!payload || typeof payload !== "object")
|
|
31
|
+
return null;
|
|
32
|
+
const data = payload;
|
|
33
|
+
if (data.form !== types_1.USERKEY_FORM || data.type !== types_1.USERKEY_TYPE)
|
|
34
|
+
return null;
|
|
35
|
+
if (typeof data.username_hash !== "string" || data.username_hash.length === 0) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
if (!data.userKeys || typeof data.userKeys !== "object")
|
|
39
|
+
return null;
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=validateUserKeyDocument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateUserKeyDocument.js","sourceRoot":"","sources":["../../../src/core/userkeys/validateUserKeyDocument.ts"],"names":[],"mappings":";;AAsBA,0DAsBC;AAED,4CASC;AAtDD,mCAIiB;AAajB;;;GAGG;AACI,KAAK,UAAU,uBAAuB,CAC3C,KAA2B;IAE3B,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC;QACrE,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,SAAS,CAAC,gCAAgC,KAAK,UAAU,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,gCAAgC,CACvE,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,gBAAgB,CAC7C,CAAC;IACF,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,IAAI,GAAG,OAAkC,CAAC;IAChD,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAY,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAY;QAAE,OAAO,IAAI,CAAC;IAC1E,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrE,OAAO,IAAyC,CAAC;AACnD,CAAC"}
|