@ibgib/core-gib 0.1.4 → 0.1.8
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.md +26 -0
- package/dist/assumptions.respec.mjs.map +1 -1
- package/dist/common/alias/alias-helper.mjs +1 -1
- package/dist/common/alias/alias-helper.mjs.map +1 -1
- package/dist/common/comment/comment-helper.mjs.map +1 -1
- package/dist/common/display/display-helper.mjs.map +1 -1
- package/dist/common/display/display-types.d.mts +1 -1
- package/dist/common/display/display-types.d.mts.map +1 -1
- package/dist/common/encrypt/encrypt-helper.mjs.map +1 -1
- package/dist/common/encrypt/encrypt-types.d.mts +1 -1
- package/dist/common/encrypt/encrypt-types.d.mts.map +1 -1
- package/dist/common/error/error-helper.mjs.map +1 -1
- package/dist/common/form/form-helper.mjs.map +1 -1
- package/dist/common/form/form-items.d.mts.map +1 -1
- package/dist/common/import-export/import-export-helper.web.mjs.map +1 -1
- package/dist/common/link/link-helper.mjs.map +1 -1
- package/dist/common/meta-stone/meta-stone-helper.mjs.map +1 -1
- package/dist/common/meta-stone/meta-stone.respec.mjs.map +1 -1
- package/dist/common/other/graph-helper.mjs +3 -3
- package/dist/common/other/graph-helper.mjs.map +1 -1
- package/dist/common/other/ibgib-helper.mjs.map +1 -1
- package/dist/common/other/ibgib-helper.respec.mjs.map +1 -1
- package/dist/common/other/other-constants.mjs +4 -4
- package/dist/common/other/other-constants.mjs.map +1 -1
- package/dist/common/other/other-helper.web.mjs.map +1 -1
- package/dist/common/other/other-types.d.mts +10 -10
- package/dist/common/other/other-types.d.mts.map +1 -1
- package/dist/common/other/svg-helper.mjs.map +1 -1
- package/dist/common/pic/pic-helper.mjs.map +1 -1
- package/dist/common/pubsub/observable/observable-base-v1.mjs +1 -1
- package/dist/common/pubsub/observable/observable-base-v1.mjs.map +1 -1
- package/dist/common/pubsub/observable/observable-event/observable-event-helper.mjs.map +1 -1
- package/dist/common/pubsub/observable/observable-helper.mjs.map +1 -1
- package/dist/common/pubsub/observable/observable-types.d.mts +1 -1
- package/dist/common/pubsub/observable/observable-types.d.mts.map +1 -1
- package/dist/common/pubsub/observer/observer-helper.mjs.map +1 -1
- package/dist/common/pubsub/observer/observer-types.d.mts.map +1 -1
- package/dist/common/pubsub/subject/subject-helper.mjs.map +1 -1
- package/dist/common/pubsub/subject/subject-types.d.mts +1 -1
- package/dist/common/pubsub/subject/subject-types.d.mts.map +1 -1
- package/dist/common/pubsub/subject/subject-v1.mjs.map +1 -1
- package/dist/common/pubsub/subject/subject.respec.mjs.map +1 -1
- package/dist/common/pubsub/subscription/subscription-helper.mjs.map +1 -1
- package/dist/common/pubsub/subscription/subscription-types.d.mts.map +1 -1
- package/dist/common/pubsub/subscription/subscription-v1.mjs.map +1 -1
- package/dist/common/secret/secret-helper.mjs.map +1 -1
- package/dist/common/secret/secret-types.d.mts +1 -1
- package/dist/common/secret/secret-types.d.mts.map +1 -1
- package/dist/common/secret/secret.respec.mjs +1 -1
- package/dist/common/secret/secret.respec.mjs.map +1 -1
- package/dist/common/tag/tag-helper.mjs.map +1 -1
- package/dist/core-helper.respec.mjs.map +1 -1
- package/dist/keystone/keystone-config-builder.d.mts +77 -0
- package/dist/keystone/keystone-config-builder.d.mts.map +1 -0
- package/dist/keystone/keystone-config-builder.mjs +157 -0
- package/dist/keystone/keystone-config-builder.mjs.map +1 -0
- package/dist/keystone/keystone-constants.d.mts +36 -0
- package/dist/keystone/keystone-constants.d.mts.map +1 -0
- package/dist/keystone/keystone-constants.mjs +39 -0
- package/dist/keystone/keystone-constants.mjs.map +1 -0
- package/dist/keystone/keystone-helpers.d.mts +117 -0
- package/dist/keystone/keystone-helpers.d.mts.map +1 -0
- package/dist/keystone/keystone-helpers.mjs +455 -0
- package/dist/keystone/keystone-helpers.mjs.map +1 -0
- package/dist/keystone/keystone-service-v1.d.mts +77 -0
- package/dist/keystone/keystone-service-v1.d.mts.map +1 -0
- package/dist/keystone/keystone-service-v1.mjs +502 -0
- package/dist/keystone/keystone-service-v1.mjs.map +1 -0
- package/dist/keystone/keystone-service-v1.respec.d.mts +2 -0
- package/dist/keystone/keystone-service-v1.respec.d.mts.map +1 -0
- package/dist/keystone/keystone-service-v1.respec.mjs +460 -0
- package/dist/keystone/keystone-service-v1.respec.mjs.map +1 -0
- package/dist/keystone/keystone-types.d.mts +248 -0
- package/dist/keystone/keystone-types.d.mts.map +1 -0
- package/dist/keystone/keystone-types.mjs +50 -0
- package/dist/keystone/keystone-types.mjs.map +1 -0
- package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.d.mts +35 -0
- package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.d.mts.map +1 -0
- package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs +107 -0
- package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs.map +1 -0
- package/dist/keystone/strategy/keystone-strategy-factory.d.mts +15 -0
- package/dist/keystone/strategy/keystone-strategy-factory.d.mts.map +1 -0
- package/dist/keystone/strategy/keystone-strategy-factory.mjs +26 -0
- package/dist/keystone/strategy/keystone-strategy-factory.mjs.map +1 -0
- package/dist/keystone/strategy/keystone-strategy.d.mts +48 -0
- package/dist/keystone/strategy/keystone-strategy.d.mts.map +1 -0
- package/dist/keystone/strategy/keystone-strategy.mjs +14 -0
- package/dist/keystone/strategy/keystone-strategy.mjs.map +1 -0
- package/dist/respec-gib.node.mjs +3 -1
- package/dist/respec-gib.node.mjs.map +1 -1
- package/dist/spec-helper.node.respec.d.mts.map +1 -1
- package/dist/spec-helper.node.respec.mjs +4 -6
- package/dist/spec-helper.node.respec.mjs.map +1 -1
- package/dist/timeline/timeline-api.mjs +12 -12
- package/dist/timeline/timeline-api.mjs.map +1 -1
- package/dist/witness/anonymous-fn/anonymous-fn-helper.mjs.map +1 -1
- package/dist/witness/anonymous-fn/anonymous-fn-v1.mjs.map +1 -1
- package/dist/witness/app/app-base-v1.mjs.map +1 -1
- package/dist/witness/app/app-helper.mjs.map +1 -1
- package/dist/witness/app/app-types.d.mts.map +1 -1
- package/dist/witness/factory/dynamic-form-factory-base.mjs.map +1 -1
- package/dist/witness/light-witness-base-v1.mjs.map +1 -1
- package/dist/witness/robbot/robbot-base-v1.mjs +1 -1
- package/dist/witness/robbot/robbot-base-v1.mjs.map +1 -1
- package/dist/witness/robbot/robbot-helper.mjs.map +1 -1
- package/dist/witness/robbot/robbot-types.d.mts +20 -20
- package/dist/witness/robbot/robbot-types.d.mts.map +1 -1
- package/dist/witness/space/bootstrap/bootstrap-helper.mjs.map +1 -1
- package/dist/witness/space/filesystem-space/filesystem-space-v1.mjs.map +1 -1
- package/dist/witness/space/filesystem-space/filesystem-space-v1.respec.mjs.map +1 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-helper.mjs.map +1 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-types.d.mts.map +1 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-v1.mjs +1 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-v1.mjs.map +1 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mjs.map +1 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mjs.map +1 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mjs.map +1 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.mjs.map +1 -1
- package/dist/witness/space/inner-space/inner-space-v1.mjs.map +1 -1
- package/dist/witness/space/inner-space/inner-space-v1.respec.mjs.map +1 -1
- package/dist/witness/space/metaspace/metaspace-base.mjs +1 -1
- package/dist/witness/space/metaspace/metaspace-base.mjs.map +1 -1
- package/dist/witness/space/metaspace/metaspace-innerspace/metaspace-innerspace-helper.mjs.map +1 -1
- package/dist/witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs.map +1 -1
- package/dist/witness/space/outer-space/outer-space-helper.mjs.map +1 -1
- package/dist/witness/space/outer-space/outer-space-types.d.mts.map +1 -1
- package/dist/witness/space/outer-space/outer-space-types.mjs +1 -1
- package/dist/witness/space/outer-space/outer-space-types.mjs.map +1 -1
- package/dist/witness/space/reconciliation-space/reconciliation-space-base.mjs.map +1 -1
- package/dist/witness/space/reconciliation-space/reconciliation-space-helper.mjs.map +1 -1
- package/dist/witness/space/space-base-v1.mjs.map +1 -1
- package/dist/witness/space/space-constants.mjs +4 -4
- package/dist/witness/space/space-constants.mjs.map +1 -1
- package/dist/witness/space/space-helper.mjs +2 -2
- package/dist/witness/space/space-helper.mjs.map +1 -1
- package/dist/witness/space/space-respec-helper.mjs.map +1 -1
- package/dist/witness/space/space-types.d.mts +4 -4
- package/dist/witness/space/space-types.d.mts.map +1 -1
- package/dist/witness/witness-base-v1.mjs.map +1 -1
- package/dist/witness/witness-form-builder.mjs.map +1 -1
- package/dist/witness/witness-helper.mjs.map +1 -1
- package/dist/witness/witness-with-context/witness-with-context-base-v1.mjs.map +1 -1
- package/package.json +6 -5
- package/src/keystone/README.md +162 -0
- package/src/keystone/keystone-config-builder.mts +187 -0
- package/src/keystone/keystone-constants.mts +44 -0
- package/src/keystone/keystone-helpers.mts +571 -0
- package/src/keystone/keystone-service-v1.mts +611 -0
- package/src/keystone/keystone-service-v1.respec.mts +555 -0
- package/src/keystone/keystone-types.mts +315 -0
- package/src/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mts +146 -0
- package/src/keystone/strategy/keystone-strategy-factory.mts +35 -0
- package/src/keystone/strategy/keystone-strategy.mts +71 -0
- package/src/respec-gib.node.mts +3 -1
- package/src/spec-helper.node.respec.mts +4 -6
- package/src/witness/robbot/robbot-base-v1.mts +1 -1
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
import { respecfully, iReckon, firstOfAll, respecfullyDear, ifWeMight } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
|
|
2
|
+
const maam = `[${import.meta.url}]`, sir = maam;
|
|
3
|
+
import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
|
|
4
|
+
// import { MetaspaceService, } from '@ibgib/core-gib/dist/witness/space/metaspace/metaspace-types.mjs';
|
|
5
|
+
// import { Metaspace_Innerspace } from '@ibgib/core-gib/dist/witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
|
|
6
|
+
// import { IbGibSpaceAny } from '@ibgib/core-gib/dist/witness/space/space-base-v1.mjs';
|
|
7
|
+
import { GLOBAL_LOG_A_LOT } from '../core-constants.mjs';
|
|
8
|
+
import { KeystoneStrategyFactory } from './strategy/keystone-strategy-factory.mjs';
|
|
9
|
+
import { createRevocationPoolConfig, createStandardPoolConfig } from './keystone-config-builder.mjs';
|
|
10
|
+
import { POOL_ID_DEFAULT, POOL_ID_REVOKE, KEYSTONE_VERB_REVOKE } from './keystone-constants.mjs';
|
|
11
|
+
import { KeystoneService_V1 } from './keystone-service-v1.mjs';
|
|
12
|
+
const logalot = GLOBAL_LOG_A_LOT;
|
|
13
|
+
// /**
|
|
14
|
+
// * not sure where to put this, but we probably will want to reuse this in the
|
|
15
|
+
// * future (assuming it works)
|
|
16
|
+
// * @returns metaspace service reference
|
|
17
|
+
// */
|
|
18
|
+
// async function getNewInitializedInMemoryMetaspaceForTesting({
|
|
19
|
+
// defaultSpaceName,
|
|
20
|
+
// }: {
|
|
21
|
+
// defaultSpaceName: string,
|
|
22
|
+
// }): Promise<MetaspaceService> {
|
|
23
|
+
// const lc = `[${getNewInitializedInMemoryMetaspaceForTesting.name}]`;
|
|
24
|
+
// try {
|
|
25
|
+
// if (logalot) { console.log(`${lc} starting... (I: 766d7596addcb73f4820586469233b25)`); }
|
|
26
|
+
// let metaspace = new Metaspace_Innerspace(/*cacheSvc*/undefined);
|
|
27
|
+
// if (logalot) { console.log(`${lc} creating metaspace complete. initializing... (I: 61b74d62e8832c9fa853e4b8c4c2d825)`); }
|
|
28
|
+
// getGibInfo()
|
|
29
|
+
// await metaspace.initialize({
|
|
30
|
+
// spaceName: defaultSpaceName,
|
|
31
|
+
// /**
|
|
32
|
+
// * passing in undefined will use the defaults. probably will need to
|
|
33
|
+
// * adjust this for testing purposes, but let's see what happens with
|
|
34
|
+
// * this first.
|
|
35
|
+
// */
|
|
36
|
+
// metaspaceFactory: {
|
|
37
|
+
// fnDtoToSpace: async () => {
|
|
38
|
+
// if (!currentSpace) { currentSpace = new IbGibTestSpace(); }
|
|
39
|
+
// return currentSpace;
|
|
40
|
+
// },
|
|
41
|
+
// fnZeroSpaceFactory: () => {
|
|
42
|
+
// if (!currentZeroSpace) { currentZeroSpace = new IbGibTestSpace(); }
|
|
43
|
+
// return currentZeroSpace;
|
|
44
|
+
// },
|
|
45
|
+
// fnDefaultLocalSpaceFactory: async () => {
|
|
46
|
+
// if (!currentSpace) { currentSpace = new IbGibTestSpace(); }
|
|
47
|
+
// return currentSpace;
|
|
48
|
+
// },
|
|
49
|
+
// // export type DtoToSpaceFunction = (spaceDto: IbGib_V1) => Promise<IbGibSpaceAny>;
|
|
50
|
+
// // export type ZeroSpaceFactoryFunction = () => IbGibSpaceAny;
|
|
51
|
+
// // export type LocalSpaceFactoryFunction = (opts: CreateLocalSpaceOptions) => Promise<IbGibSpaceAny | undefined>;
|
|
52
|
+
// },
|
|
53
|
+
// getFnAlert: () => { return async ({ title, msg }) => console.log(title, msg) },
|
|
54
|
+
// getFnPrompt: () => {
|
|
55
|
+
// return async ({ title, msg }) => {
|
|
56
|
+
// // if this is needed, we might set up some way for testing
|
|
57
|
+
// // to prepare either a queue of prompts or some kind of map or getter
|
|
58
|
+
// // and put it on the metaspace itself
|
|
59
|
+
// throw new Error(`not implemented (E: c7ef688a02f8cb74487260f9274ac825)`);
|
|
60
|
+
// // promptForText({ title, msg, confirm: false });
|
|
61
|
+
// }
|
|
62
|
+
// },
|
|
63
|
+
// getFnPromptPassword: () => {
|
|
64
|
+
// return async () => {
|
|
65
|
+
// // similar to getFnPrompt, if we need a _different_
|
|
66
|
+
// // password, we might set up some way for testing to prepare
|
|
67
|
+
// // either a queue of passwords or some kind of map or getter
|
|
68
|
+
// // and put it on the metaspace itself
|
|
69
|
+
// return 'password';
|
|
70
|
+
// // promptForSecret({ confirm: true })
|
|
71
|
+
// }
|
|
72
|
+
// },
|
|
73
|
+
// });
|
|
74
|
+
// return metaspace;
|
|
75
|
+
// } catch (error) {
|
|
76
|
+
// console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
77
|
+
// throw error;
|
|
78
|
+
// } finally {
|
|
79
|
+
// if (logalot) { console.log(`${lc} complete.`); }
|
|
80
|
+
// }
|
|
81
|
+
// }
|
|
82
|
+
/**
|
|
83
|
+
* A simple in-memory map acting as a Space.
|
|
84
|
+
* Pure Storage. No Indexing logic.
|
|
85
|
+
*/
|
|
86
|
+
class MockIbGibSpace {
|
|
87
|
+
name;
|
|
88
|
+
store = new Map();
|
|
89
|
+
constructor(name = "mock_space") {
|
|
90
|
+
this.name = name;
|
|
91
|
+
}
|
|
92
|
+
async put({ ibGib }) {
|
|
93
|
+
const addr = getIbGibAddr({ ibGib });
|
|
94
|
+
this.store.set(addr, JSON.parse(JSON.stringify(ibGib))); // Deep copy
|
|
95
|
+
}
|
|
96
|
+
async get({ addr }) {
|
|
97
|
+
const data = this.store.get(addr);
|
|
98
|
+
return data ? JSON.parse(JSON.stringify(data)) : null;
|
|
99
|
+
}
|
|
100
|
+
async witness(arg) {
|
|
101
|
+
const cmd = arg.data?.cmd;
|
|
102
|
+
if (cmd === 'get') {
|
|
103
|
+
const addrs = arg.data.ibGibAddrs || [];
|
|
104
|
+
const ibGibs = [];
|
|
105
|
+
for (const addr of addrs) {
|
|
106
|
+
const ig = await this.get({ addr });
|
|
107
|
+
if (ig)
|
|
108
|
+
ibGibs.push(ig);
|
|
109
|
+
}
|
|
110
|
+
return { ibGibs };
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* A partial mock of Metaspace.
|
|
117
|
+
* Handles:
|
|
118
|
+
* 1. Retrieving the local space.
|
|
119
|
+
* 2. Delegating 'put' to the space.
|
|
120
|
+
* 3. 'registerNewIbGib': Tracking the HEAD of a timeline.
|
|
121
|
+
*/
|
|
122
|
+
class MockMetaspaceService {
|
|
123
|
+
space;
|
|
124
|
+
/**
|
|
125
|
+
* Map of TJP Gib (Timeline ID) -> Latest IbGib Addr (Head)
|
|
126
|
+
*/
|
|
127
|
+
timelineHeads = new Map();
|
|
128
|
+
constructor(space) {
|
|
129
|
+
this.space = space;
|
|
130
|
+
}
|
|
131
|
+
async getLocalUserSpace({ lock }) {
|
|
132
|
+
return this.space;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Metaspace often acts as a facade for put, defaulting to local space.
|
|
136
|
+
*/
|
|
137
|
+
async put(args) {
|
|
138
|
+
const target = args.space || this.space;
|
|
139
|
+
return target.put(args);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Tracks the latest version of an ibGib timeline.
|
|
143
|
+
*/
|
|
144
|
+
async registerNewIbGib(args) {
|
|
145
|
+
const { ibGib } = args;
|
|
146
|
+
const targetSpace = args.space || this.space;
|
|
147
|
+
// 1. Ensure it is stored
|
|
148
|
+
await targetSpace.put({ ibGib });
|
|
149
|
+
// 2. Extract TJP (Timeline Identifier)
|
|
150
|
+
// Simplified logic mirroring getGibInfo
|
|
151
|
+
const gib = ibGib.gib || '';
|
|
152
|
+
let tjpGib = gib;
|
|
153
|
+
if (gib.includes('.')) {
|
|
154
|
+
// It's a frame in a timeline: "punctiliarHash.tjpHash"
|
|
155
|
+
// The TJP is the suffix.
|
|
156
|
+
const parts = gib.split('.');
|
|
157
|
+
tjpGib = parts.slice(1).join('.');
|
|
158
|
+
}
|
|
159
|
+
// Else: It's a Primitive or a TJP itself (Genesis).
|
|
160
|
+
// If Genesis (isTjp=true), the gib IS the tjpGib.
|
|
161
|
+
const addr = getIbGibAddr({ ibGib });
|
|
162
|
+
this.timelineHeads.set(tjpGib, addr);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// ===========================================================================
|
|
166
|
+
// SUITE A: STRATEGY VECTORS (The Math)
|
|
167
|
+
// ===========================================================================
|
|
168
|
+
await respecfully(sir, 'Suite A: Strategy Vectors (HashRevealV1)', async () => {
|
|
169
|
+
// Setup generic variables
|
|
170
|
+
const masterSecret = "TestSecret_12345";
|
|
171
|
+
const salt = "TestPool";
|
|
172
|
+
let config;
|
|
173
|
+
firstOfAll(sir, async () => {
|
|
174
|
+
// Use our standard builder to get a valid config object
|
|
175
|
+
config = createStandardPoolConfig(salt);
|
|
176
|
+
});
|
|
177
|
+
await respecfully(sir, 'Derivation Logic', async () => {
|
|
178
|
+
await ifWeMight(sir, 'derivePoolSecret with same inputs returns same output', async () => {
|
|
179
|
+
const strategy = KeystoneStrategyFactory.create({ config });
|
|
180
|
+
const secretA = await strategy.derivePoolSecret({ masterSecret });
|
|
181
|
+
const secretB = await strategy.derivePoolSecret({ masterSecret });
|
|
182
|
+
iReckon(sir, secretA).asTo('secret consistency').willEqual(secretB);
|
|
183
|
+
iReckon(sir, secretA).asTo('secret length').isGonnaBeTruthy();
|
|
184
|
+
});
|
|
185
|
+
await ifWeMight(sir, 'derivePoolSecret with different master secret returns different output', async () => {
|
|
186
|
+
const strategy = KeystoneStrategyFactory.create({ config });
|
|
187
|
+
const secretA = await strategy.derivePoolSecret({ masterSecret });
|
|
188
|
+
const secretB = await strategy.derivePoolSecret({ masterSecret: masterSecret + "_diff" });
|
|
189
|
+
iReckon(sir, secretA).asTo('secrets differ').not.willEqual(secretB);
|
|
190
|
+
});
|
|
191
|
+
await ifWeMight(sir, 'derivePoolSecret with different salt returns different output', async () => {
|
|
192
|
+
// Modify salt in a copy of config
|
|
193
|
+
const configB = { ...config, salt: "OtherPool" };
|
|
194
|
+
const strategyA = KeystoneStrategyFactory.create({ config });
|
|
195
|
+
const strategyB = KeystoneStrategyFactory.create({ config: configB });
|
|
196
|
+
const secretA = await strategyA.derivePoolSecret({ masterSecret });
|
|
197
|
+
const secretB = await strategyB.derivePoolSecret({ masterSecret });
|
|
198
|
+
iReckon(sir, secretA).asTo('salt affects secret').not.willEqual(secretB);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
await respecfully(sir, 'Challenge/Solution Logic', async () => {
|
|
202
|
+
await ifWeMight(sir, 'generateSolution -> generateChallenge -> validateSolution loop works', async () => {
|
|
203
|
+
const strategy = KeystoneStrategyFactory.create({ config });
|
|
204
|
+
const poolSecret = await strategy.derivePoolSecret({ masterSecret });
|
|
205
|
+
const challengeId = "a3ff7843552870fc28bef2b"; // arbitrary random challengeId
|
|
206
|
+
// 1. Generate Solution
|
|
207
|
+
const solution = await strategy.generateSolution({ poolSecret, poolId: salt, challengeId });
|
|
208
|
+
iReckon(sir, solution.value).asTo('solution value exists').isGonnaBeTruthy();
|
|
209
|
+
iReckon(sir, solution.challengeId).asTo('id matches').willEqual(challengeId);
|
|
210
|
+
// 2. Generate Public Challenge from Solution
|
|
211
|
+
const challenge = await strategy.generateChallenge({ solution });
|
|
212
|
+
iReckon(sir, challenge.hash).asTo('challenge hash exists').isGonnaBeTruthy();
|
|
213
|
+
// 3. Validate
|
|
214
|
+
const isValid = await strategy.validateSolution({ solution, challenge });
|
|
215
|
+
iReckon(sir, isValid).asTo('valid pair should pass').isGonnaBeTrue();
|
|
216
|
+
});
|
|
217
|
+
await ifWeMight(sir, 'validateSolution fails for mismatched values', async () => {
|
|
218
|
+
const strategy = KeystoneStrategyFactory.create({ config });
|
|
219
|
+
const poolSecret = await strategy.derivePoolSecret({ masterSecret });
|
|
220
|
+
const challengeId = "8c994f3ed598f150e25513"; // arbitrary random challengeId
|
|
221
|
+
// Generate real pair
|
|
222
|
+
const solution = await strategy.generateSolution({ poolSecret, poolId: salt, challengeId });
|
|
223
|
+
const challenge = await strategy.generateChallenge({ solution });
|
|
224
|
+
// Tamper with solution value
|
|
225
|
+
const badSolution = { ...solution, value: "hacked_value" };
|
|
226
|
+
const isValid = await strategy.validateSolution({ solution: badSolution, challenge });
|
|
227
|
+
iReckon(sir, isValid).asTo('tampered solution should fail').isGonnaBeFalse();
|
|
228
|
+
});
|
|
229
|
+
await ifWeMight(sir, 'validateSolution fails for mismatched challenge hashes', async () => {
|
|
230
|
+
const strategy = KeystoneStrategyFactory.create({ config });
|
|
231
|
+
const poolSecret = await strategy.derivePoolSecret({ masterSecret });
|
|
232
|
+
// Generate pair A
|
|
233
|
+
const challengeId_A = "416c38cfd6ee63dbf8d4e5ef36"; // arbitrary random challengeId
|
|
234
|
+
const solutionA = await strategy.generateSolution({ poolSecret, poolId: salt, challengeId: challengeId_A });
|
|
235
|
+
// Generate pair B
|
|
236
|
+
const challengeId_B = "c487ef6b7878fae798c3"; // arbitrary random challengeId
|
|
237
|
+
const solutionB = await strategy.generateSolution({ poolSecret, poolId: salt, challengeId: challengeId_B });
|
|
238
|
+
const challengeB = await strategy.generateChallenge({ solution: solutionB });
|
|
239
|
+
// Check A against B
|
|
240
|
+
const isValid = await strategy.validateSolution({ solution: solutionA, challenge: challengeB });
|
|
241
|
+
iReckon(sir, isValid).asTo('mismatched pair should fail').isGonnaBeFalse();
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
// ===========================================================================
|
|
246
|
+
// SUITE B: SERVICE LIFECYCLE (Genesis -> Sign -> Validate)
|
|
247
|
+
// ===========================================================================
|
|
248
|
+
await respecfully(sir, 'Suite B: Service Lifecycle', async () => {
|
|
249
|
+
const service = new KeystoneService_V1();
|
|
250
|
+
const masterSecret = "AliceSecretKey_987654321";
|
|
251
|
+
let mockSpace;
|
|
252
|
+
let mockMetaspace;
|
|
253
|
+
let genesisKeystone;
|
|
254
|
+
let signedKeystone;
|
|
255
|
+
firstOfAll(sir, async () => {
|
|
256
|
+
mockSpace = new MockIbGibSpace();
|
|
257
|
+
mockMetaspace = new MockMetaspaceService(mockSpace);
|
|
258
|
+
});
|
|
259
|
+
await respecfully(sir, 'Genesis', async () => {
|
|
260
|
+
await ifWeMight(sir, 'creates a valid genesis frame and persists it', async () => {
|
|
261
|
+
const config = createStandardPoolConfig(POOL_ID_DEFAULT);
|
|
262
|
+
genesisKeystone = await service.genesis({
|
|
263
|
+
masterSecret,
|
|
264
|
+
configs: [config],
|
|
265
|
+
metaspace: mockMetaspace,
|
|
266
|
+
space: mockSpace,
|
|
267
|
+
});
|
|
268
|
+
// Verify Object
|
|
269
|
+
iReckon(sir, genesisKeystone).asTo('genesis object').isGonnaBeTruthy();
|
|
270
|
+
iReckon(sir, genesisKeystone.data?.isTjp).asTo('isTjp').isGonnaBeTrue();
|
|
271
|
+
// Verify Persistence
|
|
272
|
+
const addr = getIbGibAddr({ ibGib: genesisKeystone });
|
|
273
|
+
const saved = await mockSpace.get({ addr });
|
|
274
|
+
iReckon(sir, saved).asTo('persisted to space').isGonnaBeTruthy();
|
|
275
|
+
// Verify Registration (Timeline Tracking)
|
|
276
|
+
// Genesis gib should be registered as a timeline head
|
|
277
|
+
const head = mockMetaspace.timelineHeads.get(genesisKeystone.gib);
|
|
278
|
+
iReckon(sir, head).asTo('genesis registered as timeline head').willEqual(addr);
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
await respecfully(sir, 'Signing (Evolution)', async () => {
|
|
282
|
+
await ifWeMight(sir, 'evolves the keystone with a valid proof', async () => {
|
|
283
|
+
const claim = {
|
|
284
|
+
target: "comment 123^gib",
|
|
285
|
+
verb: "post"
|
|
286
|
+
};
|
|
287
|
+
const details = { note: "First post!" };
|
|
288
|
+
signedKeystone = await service.sign({
|
|
289
|
+
latestKeystone: genesisKeystone,
|
|
290
|
+
masterSecret,
|
|
291
|
+
claim,
|
|
292
|
+
poolId: POOL_ID_DEFAULT,
|
|
293
|
+
frameDetails: details,
|
|
294
|
+
metaspace: mockMetaspace,
|
|
295
|
+
space: mockSpace,
|
|
296
|
+
});
|
|
297
|
+
iReckon(sir, signedKeystone).asTo('new frame created').isGonnaBeTruthy();
|
|
298
|
+
iReckon(sir, signedKeystone).asTo('is different frame').not.isGonnaBe(genesisKeystone);
|
|
299
|
+
// NOTE: If this fails, check if 'sign' calls 'space.put' or 'metaspace.put'!
|
|
300
|
+
// In your current 'sign' implementation, you return the object but might have missed the save step.
|
|
301
|
+
const addr = getIbGibAddr({ ibGib: signedKeystone });
|
|
302
|
+
const saved = await mockSpace.get({ addr });
|
|
303
|
+
iReckon(sir, saved).asTo('persisted to space').isGonnaBeTruthy();
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
await respecfully(sir, 'Validation', async () => {
|
|
307
|
+
await ifWeMight(sir, 'validates the genesis->signed transition', async () => {
|
|
308
|
+
const errors = await service.validate({
|
|
309
|
+
prevIbGib: genesisKeystone,
|
|
310
|
+
currentIbGib: signedKeystone,
|
|
311
|
+
// metaspace: mockMetaspace,
|
|
312
|
+
// space: mockSpace as any,
|
|
313
|
+
});
|
|
314
|
+
iReckon(sir, errors.length).asTo('signature validation has no errors').willEqual(0);
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
// ===========================================================================
|
|
319
|
+
// SUITE C: SECURITY & SAD PATHS
|
|
320
|
+
// ===========================================================================
|
|
321
|
+
await respecfully(sir, 'Suite C: Security Vectors', async () => {
|
|
322
|
+
const service = new KeystoneService_V1();
|
|
323
|
+
const aliceSecret = "AliceSecret_111";
|
|
324
|
+
const eveSecret = "EveSecret_666";
|
|
325
|
+
let mockSpace;
|
|
326
|
+
let mockMetaspace;
|
|
327
|
+
let genesisKeystone;
|
|
328
|
+
firstOfAll(sir, async () => {
|
|
329
|
+
mockSpace = new MockIbGibSpace();
|
|
330
|
+
mockMetaspace = new MockMetaspaceService(mockSpace);
|
|
331
|
+
// Setup Alice's Identity
|
|
332
|
+
const config = createStandardPoolConfig(POOL_ID_DEFAULT);
|
|
333
|
+
config.behavior.size = 10;
|
|
334
|
+
genesisKeystone = await service.genesis({
|
|
335
|
+
masterSecret: aliceSecret,
|
|
336
|
+
configs: [config],
|
|
337
|
+
metaspace: mockMetaspace,
|
|
338
|
+
space: mockSpace,
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
await respecfully(sir, 'Wrong Secret (Forgery)', async () => {
|
|
342
|
+
await ifWeMight(sir, 'prevents creation of forged frames', async () => {
|
|
343
|
+
const claim = { target: "comment 123^gib", verb: "post" };
|
|
344
|
+
let errorCaught = false;
|
|
345
|
+
let errorMsg = "";
|
|
346
|
+
try {
|
|
347
|
+
// Eve tries to sign Alice's keystone.
|
|
348
|
+
// This MUST fail because sign() calls evolve(), which calls validate().
|
|
349
|
+
await service.sign({
|
|
350
|
+
latestKeystone: genesisKeystone,
|
|
351
|
+
masterSecret: eveSecret,
|
|
352
|
+
claim,
|
|
353
|
+
poolId: POOL_ID_DEFAULT,
|
|
354
|
+
metaspace: mockMetaspace,
|
|
355
|
+
space: mockSpace,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
catch (e) {
|
|
359
|
+
errorCaught = true;
|
|
360
|
+
errorMsg = e.message;
|
|
361
|
+
}
|
|
362
|
+
iReckon(sir, errorCaught).asTo('service rejected forgery').isGonnaBeTrue();
|
|
363
|
+
// Verify it was a crypto error, not something else
|
|
364
|
+
iReckon(sir, errorMsg).asTo('error mentions crypto violation').includes('Crypto Violation');
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
await respecfully(sir, 'Policy Violation (Restricted Verbs)', async () => {
|
|
368
|
+
await ifWeMight(sir, 'throws error if signing forbidden verb with restricted pool', async () => {
|
|
369
|
+
// Create a specific restricted pool config manually
|
|
370
|
+
const restrictedPoolId = "read_only_pool";
|
|
371
|
+
const restrictedConfig = createStandardPoolConfig(restrictedPoolId);
|
|
372
|
+
// Manually restrict it (since Builder defaults to undefined/allow-all)
|
|
373
|
+
restrictedConfig.allowedVerbs = ['read'];
|
|
374
|
+
const restrictedGenesis = await service.genesis({
|
|
375
|
+
masterSecret: aliceSecret,
|
|
376
|
+
configs: [restrictedConfig],
|
|
377
|
+
metaspace: mockMetaspace,
|
|
378
|
+
space: mockSpace,
|
|
379
|
+
});
|
|
380
|
+
// Try to sign "write" using "read_only_pool"
|
|
381
|
+
const claim = { target: "data^gib", verb: "write" };
|
|
382
|
+
let errorCaught = false;
|
|
383
|
+
try {
|
|
384
|
+
await service.sign({
|
|
385
|
+
latestKeystone: restrictedGenesis,
|
|
386
|
+
masterSecret: aliceSecret,
|
|
387
|
+
claim,
|
|
388
|
+
poolId: restrictedPoolId, // Force use of restricted pool
|
|
389
|
+
metaspace: mockMetaspace,
|
|
390
|
+
space: mockSpace,
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
catch (e) {
|
|
394
|
+
errorCaught = true;
|
|
395
|
+
// Optional: Check error message contains "not authorized"
|
|
396
|
+
}
|
|
397
|
+
iReckon(sir, errorCaught).asTo('policy enforced').isGonnaBeTrue();
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
});
|
|
401
|
+
// ===========================================================================
|
|
402
|
+
// SUITE D: REVOCATION
|
|
403
|
+
// ===========================================================================
|
|
404
|
+
await respecfullyDear(sir, 'Suite D: Revocation', async () => {
|
|
405
|
+
const service = new KeystoneService_V1();
|
|
406
|
+
const masterSecret = "AliceSecret_RevokeTest";
|
|
407
|
+
let mockSpace;
|
|
408
|
+
let mockMetaspace;
|
|
409
|
+
let genesisKeystone;
|
|
410
|
+
firstOfAll(sir, async () => {
|
|
411
|
+
mockSpace = new MockIbGibSpace();
|
|
412
|
+
mockMetaspace = new MockMetaspaceService(mockSpace);
|
|
413
|
+
// Setup Identity WITH a Revocation Pool
|
|
414
|
+
const stdConfig = createStandardPoolConfig(POOL_ID_DEFAULT);
|
|
415
|
+
const revokeConfig = createRevocationPoolConfig(POOL_ID_REVOKE); // Special Config
|
|
416
|
+
genesisKeystone = await service.genesis({
|
|
417
|
+
masterSecret,
|
|
418
|
+
configs: [stdConfig, revokeConfig],
|
|
419
|
+
metaspace: mockMetaspace,
|
|
420
|
+
space: mockSpace,
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
await respecfully(sir, 'Revoke Lifecycle', async () => {
|
|
424
|
+
let revokedKeystone;
|
|
425
|
+
await ifWeMight(sir, 'successfully creates a revocation frame', async () => {
|
|
426
|
+
revokedKeystone = await service.revoke({
|
|
427
|
+
latestKeystone: genesisKeystone,
|
|
428
|
+
masterSecret,
|
|
429
|
+
reason: "Key compromised",
|
|
430
|
+
metaspace: mockMetaspace,
|
|
431
|
+
space: mockSpace,
|
|
432
|
+
});
|
|
433
|
+
iReckon(sir, revokedKeystone).isGonnaBeTruthy();
|
|
434
|
+
// Check Data
|
|
435
|
+
const data = revokedKeystone.data;
|
|
436
|
+
iReckon(sir, data.revocationInfo).asTo('revocation info present').isGonnaBeTruthy();
|
|
437
|
+
iReckon(sir, data.revocationInfo.reason).willEqual("Key compromised");
|
|
438
|
+
iReckon(sir, data.revocationInfo.proof.claim.verb).willEqual(KEYSTONE_VERB_REVOKE);
|
|
439
|
+
});
|
|
440
|
+
await ifWeMight(sir, 'validates the revocation frame', async () => {
|
|
441
|
+
const errors = await service.validate({
|
|
442
|
+
prevIbGib: genesisKeystone,
|
|
443
|
+
currentIbGib: revokedKeystone,
|
|
444
|
+
// metaspace: mockMetaspace,
|
|
445
|
+
// space: mockSpace as any,
|
|
446
|
+
});
|
|
447
|
+
iReckon(sir, errors.length).asTo('no validation errors').willEqual(0);
|
|
448
|
+
});
|
|
449
|
+
await ifWeMight(sir, 'consumed the revocation pool (Scorched Earth)', async () => {
|
|
450
|
+
const data = revokedKeystone.data;
|
|
451
|
+
const revokePool = data.challengePools.find(p => p.id === POOL_ID_REVOKE);
|
|
452
|
+
// The pool should exist...
|
|
453
|
+
iReckon(sir, revokePool).isGonnaBeTruthy();
|
|
454
|
+
// Should be empty (0 challenges)
|
|
455
|
+
const remaining = Object.keys(revokePool.challenges);
|
|
456
|
+
iReckon(sir, remaining.length).asTo('pool depleted').willEqual(0);
|
|
457
|
+
});
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
//# sourceMappingURL=keystone-service-v1.respec.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystone-service-v1.respec.mjs","sourceRoot":"","sources":["../../src/keystone/keystone-service-v1.respec.mts"],"names":[],"mappings":"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"}
|