@ibgib/core-gib 0.1.6 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/keystone/keystone-config-builder.d.mts +77 -0
  2. package/dist/keystone/keystone-config-builder.d.mts.map +1 -0
  3. package/dist/keystone/keystone-config-builder.mjs +157 -0
  4. package/dist/keystone/keystone-config-builder.mjs.map +1 -0
  5. package/dist/keystone/keystone-config-builder.respec.d.mts +2 -0
  6. package/dist/keystone/keystone-config-builder.respec.d.mts.map +1 -0
  7. package/dist/keystone/keystone-config-builder.respec.mjs +34 -0
  8. package/dist/keystone/keystone-config-builder.respec.mjs.map +1 -0
  9. package/dist/keystone/keystone-constants.d.mts +38 -0
  10. package/dist/keystone/keystone-constants.d.mts.map +1 -0
  11. package/dist/keystone/keystone-constants.mjs +41 -0
  12. package/dist/keystone/keystone-constants.mjs.map +1 -0
  13. package/dist/keystone/keystone-helpers.d.mts +170 -0
  14. package/dist/keystone/keystone-helpers.d.mts.map +1 -0
  15. package/dist/keystone/keystone-helpers.mjs +639 -0
  16. package/dist/keystone/keystone-helpers.mjs.map +1 -0
  17. package/dist/keystone/keystone-service-v1.d.mts +110 -0
  18. package/dist/keystone/keystone-service-v1.d.mts.map +1 -0
  19. package/dist/keystone/keystone-service-v1.mjs +325 -0
  20. package/dist/keystone/keystone-service-v1.mjs.map +1 -0
  21. package/dist/keystone/keystone-service-v1.respec.d.mts +2 -0
  22. package/dist/keystone/keystone-service-v1.respec.d.mts.map +1 -0
  23. package/dist/keystone/keystone-service-v1.respec.mjs +838 -0
  24. package/dist/keystone/keystone-service-v1.respec.mjs.map +1 -0
  25. package/dist/keystone/keystone-types.d.mts +270 -0
  26. package/dist/keystone/keystone-types.d.mts.map +1 -0
  27. package/dist/keystone/keystone-types.mjs +50 -0
  28. package/dist/keystone/keystone-types.mjs.map +1 -0
  29. package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.d.mts +35 -0
  30. package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.d.mts.map +1 -0
  31. package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs +107 -0
  32. package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs.map +1 -0
  33. package/dist/keystone/strategy/keystone-strategy-factory.d.mts +15 -0
  34. package/dist/keystone/strategy/keystone-strategy-factory.d.mts.map +1 -0
  35. package/dist/keystone/strategy/keystone-strategy-factory.mjs +26 -0
  36. package/dist/keystone/strategy/keystone-strategy-factory.mjs.map +1 -0
  37. package/dist/keystone/strategy/keystone-strategy.d.mts +48 -0
  38. package/dist/keystone/strategy/keystone-strategy.d.mts.map +1 -0
  39. package/dist/keystone/strategy/keystone-strategy.mjs +14 -0
  40. package/dist/keystone/strategy/keystone-strategy.mjs.map +1 -0
  41. package/package.json +2 -1
  42. package/src/keystone/README.md +162 -0
  43. package/src/keystone/keystone-config-builder.mts +187 -0
  44. package/src/keystone/keystone-config-builder.respec.mts +49 -0
  45. package/src/keystone/keystone-constants.mts +46 -0
  46. package/src/keystone/keystone-helpers.mts +780 -0
  47. package/src/keystone/keystone-service-v1.mts +427 -0
  48. package/src/keystone/keystone-service-v1.respec.mts +1012 -0
  49. package/src/keystone/keystone-types.mts +339 -0
  50. package/src/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mts +146 -0
  51. package/src/keystone/strategy/keystone-strategy-factory.mts +35 -0
  52. package/src/keystone/strategy/keystone-strategy.mts +71 -0
@@ -0,0 +1,639 @@
1
+ import { extractErrorMsg, hash, pretty } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
2
+ import { getIbAndGib, getIbGibAddr } from "@ibgib/ts-gib/dist/helper.mjs";
3
+ import { validateIbGibIntrinsically } from "@ibgib/ts-gib/dist/V1/validate-helper.mjs";
4
+ import { mut8 } from "@ibgib/ts-gib/dist/V1/transforms/mut8.mjs";
5
+ import { Factory_V1 } from "@ibgib/ts-gib/dist/V1/factory.mjs";
6
+ import { getGib } from "@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs";
7
+ import { GLOBAL_LOG_A_LOT } from "../core-constants.mjs";
8
+ import { KEYSTONE_ATOM } from "./keystone-constants.mjs";
9
+ import { KeystoneReplenishStrategy, KEYSTONE_REPLENISH_STRATEGY_VALID_VALUES } from "./keystone-types.mjs";
10
+ import { KeystoneStrategyFactory } from "./strategy/keystone-strategy-factory.mjs";
11
+ const logalot = GLOBAL_LOG_A_LOT;
12
+ /**
13
+ * space-delimited keystone ib containing select keystone metadata.
14
+ *
15
+ * NOTE: This must match {@link parseKeystoneIb}
16
+ * @see {@link KeystoneIbInfo_V1}
17
+ */
18
+ export async function getKeystoneIb({ keystoneData, }) {
19
+ const lc = `[${getKeystoneIb.name}]`;
20
+ try {
21
+ if (logalot) {
22
+ console.log(`${lc} starting... (I: c3022a146faac9730154f34d1439a225)`);
23
+ }
24
+ const atom = KEYSTONE_ATOM;
25
+ const ib = [
26
+ atom,
27
+ ].join(' ');
28
+ return ib;
29
+ }
30
+ catch (error) {
31
+ console.error(`${lc} ${extractErrorMsg(error)}`);
32
+ throw error;
33
+ }
34
+ finally {
35
+ if (logalot) {
36
+ console.log(`${lc} complete.`);
37
+ }
38
+ }
39
+ }
40
+ /**
41
+ * NOTE: This must match {@link getKeystoneIb}
42
+ * @see {@link KeystoneIbInfo_V1}
43
+ */
44
+ export async function parseKeystoneIb({ ib, }) {
45
+ const lc = `[${parseKeystoneIb.name}]`;
46
+ try {
47
+ if (logalot) {
48
+ console.log(`${lc} starting... (I: 73cb6832984255ed48b2f44db6a21e25)`);
49
+ }
50
+ const [atom] = ib.split(' ');
51
+ if (atom !== KEYSTONE_ATOM) {
52
+ throw new Error(`invalid keystone ib. atom found in ib (${atom}) does not match keystone atom (${KEYSTONE_ATOM}) (E: 79b3d587824c4271b6e60acc76e0c825)`);
53
+ }
54
+ return {
55
+ atom,
56
+ };
57
+ }
58
+ catch (error) {
59
+ console.error(`${lc} ${extractErrorMsg(error)}`);
60
+ throw error;
61
+ }
62
+ finally {
63
+ if (logalot) {
64
+ console.log(`${lc} complete.`);
65
+ }
66
+ }
67
+ }
68
+ /**
69
+ * The Policy Engine.
70
+ * Calculates exactly which challenges MUST be consumed based on config and demands.
71
+ * Enforces STRICT DISTINCTNESS (No double-dipping).
72
+ */
73
+ export function getDeterministicRequirements({ pool, requiredChallengeIds, targetAddr }) {
74
+ const behavior = pool.config.behavior;
75
+ const mandatory = new Set();
76
+ // Start with all available IDs.
77
+ // We assume Object.keys respects insertion order (ES2015+), crucial for FIFO.
78
+ let available = Object.keys(pool.challenges);
79
+ // ---------------------------------------------------------
80
+ // 1. Alice's Demands (Explicit Requirements)
81
+ // ---------------------------------------------------------
82
+ if (requiredChallengeIds && requiredChallengeIds.length > 0) {
83
+ for (const id of requiredChallengeIds) {
84
+ if (!pool.challenges[id]) {
85
+ throw new Error(`(UNEXPECTED) Required challenge ID not found in pool: ${id} (E: 2c9f8...)`);
86
+ }
87
+ // Strict: Consume it.
88
+ if (!available.includes(id)) {
89
+ // Should be caught by check above, but handles duplicates in 'demands'
90
+ continue;
91
+ }
92
+ mandatory.add(id);
93
+ }
94
+ // Remove from available pool
95
+ available = available.filter(id => !mandatory.has(id));
96
+ }
97
+ // ---------------------------------------------------------
98
+ // 2. Target Binding (Explicit Buckets)
99
+ // ---------------------------------------------------------
100
+ if (behavior.targetBindingChars > 0 && targetAddr) {
101
+ const { gib } = getIbAndGib({ ibGibAddr: targetAddr });
102
+ if (gib) {
103
+ // Get required hex prefixes (e.g. 'a', 'b', 'c', '1')
104
+ const prefixes = gib.substring(0, behavior.targetBindingChars).toLowerCase();
105
+ for (const char of prefixes) {
106
+ // Look in the Explicit Bucket
107
+ const bucket = pool.bindingMap[char] || [];
108
+ // Find the first ID in this bucket that is still in 'available'
109
+ const match = bucket.find(id => available.includes(id));
110
+ if (!match) {
111
+ throw new Error(`Entropy Exhaustion. Cannot satisfy binding for char '${char}'. (E: 8d3a1...)`);
112
+ }
113
+ // Strict: Consume it.
114
+ mandatory.add(match);
115
+ available = available.filter(id => id !== match);
116
+ }
117
+ }
118
+ }
119
+ // ---------------------------------------------------------
120
+ // 3. FIFO (Sequential)
121
+ // ---------------------------------------------------------
122
+ if (behavior.selectSequentially > 0) {
123
+ // Take the first N from the remaining available list
124
+ if (available.length < behavior.selectSequentially) {
125
+ console.error(`[getDeterministicRequirements] Entropy Exhaustion! AvailableCount: ${available.length}, Required Seq: ${behavior.selectSequentially}. Available IDs: ${available.join(',')}`);
126
+ throw new Error(`Entropy Exhaustion. Insufficient challenges for FIFO requirement. (E: 9c2b4...)`);
127
+ }
128
+ const fifoIds = available.slice(0, behavior.selectSequentially);
129
+ fifoIds.forEach(id => mandatory.add(id));
130
+ // Remove from available
131
+ available = available.slice(behavior.selectSequentially);
132
+ }
133
+ return { mandatoryIds: mandatory, availableIds: available };
134
+ }
135
+ /**
136
+ * Helper to update the Binding Map when adding new Challenge IDs.
137
+ * Uses "Implicit Bucketing" (ID start char) but can be extended for full coverage.
138
+ */
139
+ export function addToBindingMap(map, challengeId) {
140
+ const firstChar = challengeId.charAt(0).toLowerCase();
141
+ // Validate it is hex
142
+ if (/[0-9a-f]/.test(firstChar)) {
143
+ if (!map[firstChar])
144
+ map[firstChar] = [];
145
+ map[firstChar].push(challengeId);
146
+ // OPTIONAL: Implement Full Coverage Strategy here?
147
+ // e.g. map[challengeId[1]].push(challengeId) ...
148
+ // For V1, we stick to Native/Implicit bucket (Index 0).
149
+ }
150
+ }
151
+ /**
152
+ * Helper to clean up Binding Map when removing IDs.
153
+ */
154
+ export function removeFromBindingMap(map, challengeId) {
155
+ // Since we don't know exactly which buckets an ID is in (if we did multi-bucket),
156
+ // we strictly should scan all. For V1 Native, we check first char.
157
+ // SAFE IMPLEMENTATION: Scan all buckets.
158
+ for (const key of Object.keys(map)) {
159
+ map[key] = map[key].filter(id => id !== challengeId);
160
+ }
161
+ }
162
+ /**
163
+ * Selects the specific pool to use for an operation based on ID, filter criteria, or verb authorization.
164
+ *
165
+ * @returns The matching KeystoneChallengePool
166
+ * @throws If no pool matches or if multiple pools match but one was expected.
167
+ */
168
+ export function resolveTargetPool({ pools, poolId, poolFilter, verb, }) {
169
+ const lc = `[resolveTargetPool]`;
170
+ try {
171
+ let pool;
172
+ if (poolId) {
173
+ // 1. Explicit ID Strategy
174
+ pool = pools.find(p => p.id === poolId);
175
+ if (!pool) {
176
+ throw new Error(`Pool not found with ID: ${poolId} (E: 4a2b17428515c1e82813158581898125)`);
177
+ }
178
+ }
179
+ else if (poolFilter) {
180
+ // 2. Filter Strategy
181
+ const matches = pools.filter(poolFilter);
182
+ if (matches.length === 0) {
183
+ throw new Error(`No pool matched the provided filter. (E: 5b3c27428515c1e82813158581898125)`);
184
+ }
185
+ // For now, we take the first match. In future, might want to be strict about uniqueness.
186
+ pool = matches[0];
187
+ }
188
+ else {
189
+ // 3. Auto-Resolution by Verb Strategy
190
+ if (!verb) {
191
+ throw new Error(`Cannot auto-resolve pool without a verb. (E: 6c4d37428515c1e82813158581898125)`);
192
+ }
193
+ // Priority A: Look for Specific Match (Pool explicitly lists this verb)
194
+ pool = pools.find(p => p.config.allowedVerbs && p.config.allowedVerbs.includes(verb));
195
+ // Priority B: Look for General/Default (No restrictions / Wildcard)
196
+ if (!pool) {
197
+ pool = pools.find(p => !p.config.allowedVerbs || p.config.allowedVerbs.length === 0);
198
+ }
199
+ if (!pool) {
200
+ throw new Error(`No suitable pool found for verb: ${verb} (E: 7d5e47428515c1e82813158581898125)`);
201
+ }
202
+ }
203
+ // 4. Authorization Check (Applies to all strategies if verb is present)
204
+ if (verb && pool.config.allowedVerbs && pool.config.allowedVerbs.length > 0) {
205
+ if (!pool.config.allowedVerbs.includes(verb)) {
206
+ throw new Error(`Pool ${pool.id} is not authorized for verb: ${verb} (E: 8e6f57428515c1e82813158581898125)`);
207
+ }
208
+ }
209
+ return pool;
210
+ }
211
+ catch (error) {
212
+ console.error(`${lc} ${extractErrorMsg(error)}`);
213
+ throw error;
214
+ }
215
+ }
216
+ /**
217
+ * Calculates the complete list of Challenge IDs to solve for a given operation.
218
+ * Combines Deterministic requirements (Mandatory/Binding/FIFO) with Stochastic requirements.
219
+ *
220
+ * @returns Array of unique challenge IDs.
221
+ */
222
+ export function selectChallengeIds({ pool, targetAddr, requiredChallengeIds, }) {
223
+ const lc = `[selectChallengeIds]`;
224
+ try {
225
+ // 1. Get Deterministic Requirements
226
+ const { mandatoryIds, availableIds } = getDeterministicRequirements({
227
+ pool,
228
+ requiredChallengeIds,
229
+ targetAddr
230
+ });
231
+ // 2. Stochastic Selection
232
+ const randomCount = pool.config.behavior.selectRandomly;
233
+ const randomIds = [];
234
+ if (randomCount > 0) {
235
+ if (availableIds.length < randomCount) {
236
+ throw new Error(`Insufficient challenges for random requirement. Need ${randomCount}, have ${availableIds.length} (E: 9f7a67428515c1e82813158581898125)`);
237
+ }
238
+ // Shuffle & Pick
239
+ // Note: simple Math.random sort is sufficient for V1 stochastic selection
240
+ // as we are just picking from valid available options.
241
+ const shuffled = [...availableIds].sort(() => 0.5 - Math.random());
242
+ randomIds.push(...shuffled.slice(0, randomCount));
243
+ }
244
+ // 3. Combine
245
+ return [...mandatoryIds, ...randomIds];
246
+ }
247
+ catch (error) {
248
+ console.error(`${lc} ${extractErrorMsg(error)}`);
249
+ throw error;
250
+ }
251
+ }
252
+ /**
253
+ * Generates an opaque, collision-resistant ID for a challenge.
254
+ * atow (2025/12/22) - Hash(Salt + Timestamp + Index)
255
+ */
256
+ export async function generateOpaqueChallengeId({ salt, timestamp, index }) {
257
+ // Use first 16 chars of hex (64 bits) for brevity + safety.
258
+ const raw = await hash({ s: `${salt}${timestamp}${index}` });
259
+ return raw.substring(0, 16);
260
+ }
261
+ /**
262
+ * Calculates the NEXT state of the Challenge Pools given a specific consumption event.
263
+ * Handles TopUp, ReplaceAll, Consume, and ScorchedEarth strategies.
264
+ *
265
+ * @returns The new array of KeystoneChallengePools (including the modified one).
266
+ */
267
+ export async function applyReplenishmentStrategy({ prevPools, targetPoolId, consumedIds, masterSecret, strategy, config, }) {
268
+ const lc = `[applyReplenishmentStrategy]`;
269
+ try {
270
+ const newPools = JSON.parse(JSON.stringify(prevPools));
271
+ const targetIdx = newPools.findIndex((p) => p.id === targetPoolId);
272
+ if (targetIdx === -1) {
273
+ throw new Error(`Target pool ${targetPoolId} not found in keystone data. (E: 75200388d22744838634524233772545)`);
274
+ }
275
+ const pool = newPools[targetIdx];
276
+ const poolSecret = await strategy.derivePoolSecret({ masterSecret });
277
+ const timestamp = Date.now().toString();
278
+ const strategyType = config.behavior.replenish;
279
+ // Clean up Binding Map for consumed IDs
280
+ consumedIds.forEach(id => {
281
+ if (pool.bindingMap) {
282
+ removeFromBindingMap(pool.bindingMap, id);
283
+ }
284
+ });
285
+ if (strategyType === KeystoneReplenishStrategy.topUp) {
286
+ // Remove consumed
287
+ consumedIds.forEach(id => delete pool.challenges[id]);
288
+ // Add New
289
+ for (let i = 0; i < consumedIds.length; i++) {
290
+ const newId = await generateOpaqueChallengeId({
291
+ salt: config.salt, timestamp, index: i
292
+ });
293
+ const solution = await strategy.generateSolution({
294
+ poolSecret, poolId: pool.id, challengeId: newId
295
+ });
296
+ pool.challenges[newId] = await strategy.generateChallenge({ solution });
297
+ // Update Binding Map
298
+ if (!pool.bindingMap) {
299
+ pool.bindingMap = {};
300
+ }
301
+ addToBindingMap(pool.bindingMap, newId);
302
+ }
303
+ }
304
+ else if (strategyType === KeystoneReplenishStrategy.replaceAll) {
305
+ pool.challenges = {};
306
+ pool.bindingMap = {};
307
+ for (let i = 0; i < config.behavior.size; i++) {
308
+ const newId = await generateOpaqueChallengeId({
309
+ salt: config.salt, timestamp, index: i
310
+ });
311
+ const solution = await strategy.generateSolution({
312
+ poolSecret, poolId: pool.id, challengeId: newId
313
+ });
314
+ pool.challenges[newId] = await strategy.generateChallenge({ solution });
315
+ addToBindingMap(pool.bindingMap, newId);
316
+ }
317
+ }
318
+ else if (strategyType === KeystoneReplenishStrategy.consume) {
319
+ consumedIds.forEach(id => delete pool.challenges[id]);
320
+ }
321
+ else if (strategyType === KeystoneReplenishStrategy.scorchedEarth) {
322
+ pool.challenges = {};
323
+ pool.bindingMap = {};
324
+ }
325
+ else {
326
+ throw new Error(`Unknown replenish strategy: ${strategyType}. Valid list: ${pretty(KEYSTONE_REPLENISH_STRATEGY_VALID_VALUES)} (E: 0acf56f1e1486240080e11e8046d0825)`);
327
+ }
328
+ return newPools;
329
+ }
330
+ catch (error) {
331
+ console.error(`${lc} ${extractErrorMsg(error)}`);
332
+ throw error;
333
+ }
334
+ }
335
+ /**
336
+ * High-level orchestration helper.
337
+ * 1. Instantiates Strategy.
338
+ * 2. Derives Secret.
339
+ * 3. Solves Challenges (Generates Solutions).
340
+ * 4. Replenishes Pool (Calculates the next state of ALL pools).
341
+ * 5. Constructs Proof.
342
+ *
343
+ * @returns The resulting Proof and the full list of Next Pools.
344
+ */
345
+ export async function solveAndReplenish({ targetPoolId, prevPools, masterSecret, challengeIds, claim, requiredChallengeIds, }) {
346
+ const lc = `[solveAndReplenish]`;
347
+ try {
348
+ if (logalot) {
349
+ console.log(`${lc} starting... poolId: ${targetPoolId}, ids: ${challengeIds.length}`);
350
+ }
351
+ const pool = prevPools.find(p => p.id === targetPoolId);
352
+ if (!pool) {
353
+ throw new Error(`Target pool not found: ${targetPoolId} (E: a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6)`);
354
+ }
355
+ const strategy = KeystoneStrategyFactory.create({ config: pool.config });
356
+ const poolSecret = await strategy.derivePoolSecret({ masterSecret });
357
+ const solutions = [];
358
+ // 1. Solve
359
+ for (const id of challengeIds) {
360
+ const solution = await strategy.generateSolution({
361
+ poolSecret, poolId: pool.id, challengeId: id,
362
+ });
363
+ solutions.push(solution);
364
+ }
365
+ // 2. Construct Proof
366
+ const proof = {
367
+ claim,
368
+ solutions,
369
+ requiredChallengeIds: (requiredChallengeIds && requiredChallengeIds.length > 0) ? requiredChallengeIds : undefined
370
+ };
371
+ // 3. Replenish
372
+ const nextPools = await applyReplenishmentStrategy({
373
+ prevPools,
374
+ targetPoolId: pool.id,
375
+ consumedIds: challengeIds,
376
+ masterSecret,
377
+ strategy,
378
+ config: pool.config
379
+ });
380
+ return { proof, nextPools };
381
+ }
382
+ catch (error) {
383
+ console.error(`${lc} ${extractErrorMsg(error)}`);
384
+ throw error;
385
+ }
386
+ }
387
+ /**
388
+ * Validates the transition from Prev -> Curr.
389
+ * Enforces Cryptography AND Behavioral Policy.
390
+ *
391
+ * @returns Array of validation error strings. Empty array means Valid.
392
+ */
393
+ export async function validateKeystoneTransition({ currentIbGib, prevIbGib, }) {
394
+ const lc = `[${validateKeystoneTransition.name}]`;
395
+ const errors = [];
396
+ try {
397
+ if (!currentIbGib) {
398
+ throw new Error(`(UNEXPECTED) currentIbGib falsy? (E: 3c0f02655fa8279e386a079ebb604b25)`);
399
+ }
400
+ if (!prevIbGib) {
401
+ throw new Error(`(UNEXPECTED) prevIbGib falsy? (E: 0d07c812634d839c784f31b8848ba825)`);
402
+ }
403
+ // intrinsic validation
404
+ const validationErrors = await validateIbGibIntrinsically({ ibGib: currentIbGib });
405
+ if (validationErrors && validationErrors.length > 0) {
406
+ errors.push(...validationErrors);
407
+ }
408
+ const currData = currentIbGib.data;
409
+ const prevData = prevIbGib.data;
410
+ for (const proof of currData.proofs) {
411
+ if (proof.solutions.length === 0) {
412
+ errors.push(`Proof ${proof.id || 'unknown'} has no solutions.`);
413
+ continue;
414
+ }
415
+ const poolId = proof.solutions[0].poolId;
416
+ // Standard Verification (Internal Pools Only)
417
+ // The pool MUST be present in the previous frame.
418
+ const pool = prevData.challengePools.find(p => p.id === poolId);
419
+ if (!pool) {
420
+ errors.push(`Proof references unknown pool: ${poolId}`);
421
+ continue;
422
+ }
423
+ await verifyProofAgainstPool({ proof, pool, errors });
424
+ } // End proof loop
425
+ // Revocation Logic checks
426
+ if (currData.revocationInfo) {
427
+ const target = currData.revocationInfo.proof.claim.target;
428
+ const expectedTarget = getIbGibAddr({ ibGib: prevIbGib });
429
+ if (target !== expectedTarget) {
430
+ errors.push(`Revocation target mismatch. Expected ${expectedTarget}, got ${target}`);
431
+ }
432
+ }
433
+ return errors;
434
+ }
435
+ catch (error) {
436
+ console.error(`${lc} ${extractErrorMsg(error)}`);
437
+ throw error; // System errors still throw
438
+ }
439
+ finally {
440
+ if (logalot) {
441
+ console.log(`${lc} complete.`);
442
+ }
443
+ }
444
+ }
445
+ /**
446
+ * Helper to verify a single proof against a specific pool.
447
+ */
448
+ export async function verifyProofAgainstPool({ proof, pool, errors, }) {
449
+ const lc = `[${verifyProofAgainstPool.name}]`;
450
+ try {
451
+ if (logalot) {
452
+ console.log(`${lc} starting... (I: b8f9b6085888eea2258bf579ecd5e825)`);
453
+ }
454
+ // 0. VERB AUTH
455
+ if (pool.config.allowedVerbs && pool.config.allowedVerbs.length > 0) {
456
+ if (!proof.claim.verb || !pool.config.allowedVerbs.includes(proof.claim.verb)) {
457
+ errors.push(`Policy Violation: Pool ${pool.id} used for unauthorized verb ${proof.claim.verb}`);
458
+ }
459
+ }
460
+ // 1. Reconstruct Deterministic Requirements
461
+ const { mandatoryIds, availableIds } = getDeterministicRequirements({
462
+ pool,
463
+ requiredChallengeIds: proof.requiredChallengeIds,
464
+ targetAddr: proof.claim.target // Not used extensively in V1 logic yet, mainly for logging/context
465
+ });
466
+ // 2. Check Mandatory
467
+ const proofIds = new Set(proof.solutions.map(s => s.challengeId));
468
+ for (const id of mandatoryIds) {
469
+ if (!proofIds.has(id)) {
470
+ errors.push(`Policy Violation: Missing mandatory challenge ${id}`);
471
+ }
472
+ }
473
+ // 3. Stochastic
474
+ const randomCandidates = [...proofIds].filter(id => !mandatoryIds.has(id));
475
+ const requiredRandomCount = pool.config.behavior.selectRandomly;
476
+ if (randomCandidates.length < requiredRandomCount) {
477
+ errors.push(`Policy Violation: Insufficient random count. Need ${requiredRandomCount}, got ${randomCandidates.length}`);
478
+ }
479
+ // 4. Validity (Double Dip / Existence)
480
+ for (const id of randomCandidates) {
481
+ if (!availableIds.includes(id)) {
482
+ errors.push(`Policy Violation: ID ${id} is invalid or double-dipped.`);
483
+ }
484
+ }
485
+ // 5. Crypto
486
+ const strategy = KeystoneStrategyFactory.create({ config: pool.config });
487
+ for (const solution of proof.solutions) {
488
+ const challenge = pool.challenges[solution.challengeId];
489
+ if (!challenge) {
490
+ errors.push(`Crypto Violation: Challenge ${solution.challengeId} not found in pool.`);
491
+ }
492
+ else {
493
+ const isValid = await strategy.validateSolution({ solution, challenge });
494
+ if (!isValid) {
495
+ errors.push(`Crypto Violation: Solution for ${solution.challengeId} is invalid.`);
496
+ }
497
+ }
498
+ }
499
+ }
500
+ catch (error) {
501
+ console.error(`${lc} ${extractErrorMsg(error)}`);
502
+ throw error;
503
+ }
504
+ finally {
505
+ if (logalot) {
506
+ console.log(`${lc} complete.`);
507
+ }
508
+ }
509
+ }
510
+ export async function evolvePersistAndRegisterKeystone({ prevIbGib, newData, metaspace, space, }) {
511
+ const lc = `[${evolvePersistAndRegisterKeystone.name}]`;
512
+ try {
513
+ if (logalot) {
514
+ console.log(`${lc} starting... (I: 8b10e8920f08b7842803665834cf8925)`);
515
+ }
516
+ if (!prevIbGib.data) {
517
+ throw new Error(`(UNEXPECTED) prevIbGib.data falsy? (E: 5e84875bf992c585b979e6c8ed5bf225)`);
518
+ }
519
+ if (prevIbGib.data.revocationInfo) {
520
+ throw new Error(`Keystone has already been revoked (prevIbGib.data.revocationInfo truthy), so we cannot evolve the keystone. Keystone addr: ${getIbGibAddr({ ibGib: prevIbGib })} (E: 45d7f846556829de6b2a701838c3f825)`);
521
+ }
522
+ const prevData = prevIbGib.data;
523
+ /**
524
+ * we want to completely replace these keys, so we will remove them
525
+ * from the data. This occurs first in the underlying mut8
526
+ * transform.
527
+ * @see {@link mut8}
528
+ */
529
+ let dataToRemove = {};
530
+ if (prevData.proofs) {
531
+ dataToRemove.proofs = [];
532
+ }
533
+ if (prevData.challengePools) {
534
+ dataToRemove.challengePools = [];
535
+ }
536
+ if (prevData.frameDetails) {
537
+ dataToRemove.frameDetails = {};
538
+ }
539
+ if (Object.keys(dataToRemove).length === 0) {
540
+ dataToRemove = undefined;
541
+ }
542
+ const resMut8 = await mut8({
543
+ src: prevIbGib,
544
+ dataToRemove,
545
+ dataToAddOrPatch: newData,
546
+ // dna: false, // explicitly set to false just to show
547
+ nCounter: true,
548
+ });
549
+ if (!!resMut8.intermediateIbGibs) {
550
+ throw new Error(`(UNEXPECTED) resMut8.intermediateIbGibs truthy? I'm not sure if we expect there to be intermediateIbGibs, but I feel like we shouldn't. Pretty sure we shouldn't, definitely don't *want* them. (E: ba40d55d7c2d36d438c413886f148625)`);
551
+ }
552
+ if (!!resMut8.dnas) {
553
+ throw new Error(`(UNEXPECTED) resMut8.dnas truthy? We do not want dnas with keystones. (E: 49470513d018f97d28024f4e82da3b25)`);
554
+ }
555
+ const newKeystoneIbGib = resMut8.newIbGib;
556
+ // run validation here
557
+ const errors = await validateKeystoneTransition({
558
+ currentIbGib: newKeystoneIbGib,
559
+ prevIbGib,
560
+ });
561
+ if (errors.length > 0) {
562
+ console.error(`${lc} Validation Failed:\n${errors.join('\n')}`);
563
+ throw new Error(`(UNEXPECTED) invalid keystone after we just evolved it? Errors: ${errors.join('; ')} (E: ae2c58406c1db7687879dfb89fc1f825)`);
564
+ }
565
+ // save and register
566
+ await metaspace.put({ ibGib: newKeystoneIbGib, space, });
567
+ await metaspace.registerNewIbGib({ ibGib: newKeystoneIbGib, space, });
568
+ return newKeystoneIbGib;
569
+ }
570
+ catch (error) {
571
+ console.error(`${lc} ${extractErrorMsg(error)}`);
572
+ throw error;
573
+ }
574
+ finally {
575
+ if (logalot) {
576
+ console.log(`${lc} complete.`);
577
+ }
578
+ }
579
+ }
580
+ /**
581
+ * Creates a new keystone ibgib that has no dna and no past.
582
+ */
583
+ export async function createKeystoneIbGibImpl({ data, metaspace, space, }) {
584
+ const lc = `[${createKeystoneIbGibImpl.name}]`;
585
+ try {
586
+ if (logalot) {
587
+ console.log(`${lc} starting... (I: 5e32389700e9899e788cbefacef7c825)`);
588
+ }
589
+ space ??= await metaspace.getLocalUserSpace({ lock: false });
590
+ if (!space) {
591
+ throw new Error(`(UNEXPECTED) space was falsy and we couldn't get default local user space from metaspace? (E: 9a6498cf16a8801f19ec376749742225)`);
592
+ }
593
+ // create the actual keystoneIbGib
594
+ const resFirstGen = await Factory_V1.firstGen({
595
+ parentIbGib: Factory_V1.primitive({ ib: KEYSTONE_ATOM }),
596
+ ib: await getKeystoneIb({ keystoneData: data }),
597
+ data,
598
+ dna: false,
599
+ nCounter: true,
600
+ tjp: {
601
+ timestamp: true,
602
+ uuid: true,
603
+ },
604
+ });
605
+ const keystoneIbGib = resFirstGen.newIbGib;
606
+ if (!keystoneIbGib.data) {
607
+ throw new Error(`(UNEXPECTED) keystoneIbGib.data falsy? We expect the data to be populated with real keystone data. (E: 38a358facdb89d16d81d48c8520d3d25)`);
608
+ }
609
+ if (!keystoneIbGib.rel8ns) {
610
+ throw new Error(`(UNEXPECTED) keystoneIbGib.rel8ns falsy? we expect the rel8ns to have ancestor and past. (E: 20cb7723dc33ae1ef808fe76d1bf4b25)`);
611
+ }
612
+ if (!keystoneIbGib.rel8ns.past || keystoneIbGib.rel8ns.past.length === 0) {
613
+ throw new Error(`(UNEXPECTED) keystoneIbGib.rel8ns.past falsy or empty? we expect the firstGen call to generate an interstitial ibgib that we will splice out. (E: 0fd8388d045ab9f37834c27d67e78825)`);
614
+ }
615
+ // reset n
616
+ keystoneIbGib.data.n = 0;
617
+ // reset tjp
618
+ keystoneIbGib.data.isTjp = true;
619
+ delete keystoneIbGib.rel8ns.tjp;
620
+ // reset past
621
+ delete keystoneIbGib.rel8ns.past;
622
+ // recalculate gib
623
+ keystoneIbGib.gib = await getGib({ ibGib: keystoneIbGib });
624
+ // save and register
625
+ await metaspace.put({ ibGib: keystoneIbGib, space, });
626
+ await metaspace.registerNewIbGib({ ibGib: keystoneIbGib, space, });
627
+ return keystoneIbGib;
628
+ }
629
+ catch (error) {
630
+ console.error(`${lc} ${extractErrorMsg(error)}`);
631
+ throw error;
632
+ }
633
+ finally {
634
+ if (logalot) {
635
+ console.log(`${lc} complete.`);
636
+ }
637
+ }
638
+ }
639
+ //# sourceMappingURL=keystone-helpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keystone-helpers.mjs","sourceRoot":"","sources":["../../src/keystone/keystone-helpers.mts"],"names":[],"mappings":"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"}