@hesohq/verify-wasm 0.5.0-dev.71 → 0.5.0-dev.81
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/heso_wasm.d.ts +110 -0
- package/heso_wasm.js +270 -0
- package/heso_wasm_bg.wasm +0 -0
- package/heso_wasm_bg.wasm.d.ts +18 -0
- package/package.json +2 -2
package/heso_wasm.d.ts
CHANGED
|
@@ -94,6 +94,76 @@ export class ChainResult {
|
|
|
94
94
|
set seq(value: number | null | undefined);
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
+
/**
|
|
98
|
+
* The result of an offline CloudTrail feed-completeness check.
|
|
99
|
+
*/
|
|
100
|
+
export class CloudTrailFeedVerdict {
|
|
101
|
+
private constructor();
|
|
102
|
+
free(): void;
|
|
103
|
+
[Symbol.dispose](): void;
|
|
104
|
+
/**
|
|
105
|
+
* 0-based head-first index at which the chain broke / a digest was rejected;
|
|
106
|
+
* `None` for `Complete`.
|
|
107
|
+
*/
|
|
108
|
+
get broken_at(): number | undefined;
|
|
109
|
+
/**
|
|
110
|
+
* 0-based head-first index at which the chain broke / a digest was rejected;
|
|
111
|
+
* `None` for `Complete`.
|
|
112
|
+
*/
|
|
113
|
+
set broken_at(value: number | null | undefined);
|
|
114
|
+
/**
|
|
115
|
+
* Number of hourly digests whose signature + chain link verified.
|
|
116
|
+
*/
|
|
117
|
+
digests_verified: number;
|
|
118
|
+
/**
|
|
119
|
+
* `true` ONLY when an unbroken signed chain proved completeness back to the
|
|
120
|
+
* starting (genesis) digest — the single state that earns a third-party
|
|
121
|
+
* `feed_complete` claim. A `ChainGap` (disclosed gap) reports `false`.
|
|
122
|
+
*/
|
|
123
|
+
feed_complete: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* The kind tag of the outcome: `"Complete"`, `"ChainGap"`, `"Empty"`,
|
|
126
|
+
* `"Malformed"`, `"NoMatchingKey"`, `"SignatureInvalid"`,
|
|
127
|
+
* `"PreviousHashMismatch"`, `"PreviousSignatureMismatch"`,
|
|
128
|
+
* `"PreviousObjectMismatch"`.
|
|
129
|
+
*/
|
|
130
|
+
kind: string;
|
|
131
|
+
/**
|
|
132
|
+
* Number of signed log files the verified digests committed to across the
|
|
133
|
+
* window. For `Complete` this is the SIGNED, COMPLETE inventory the window
|
|
134
|
+
* provably covers (no log file could have been added, removed, or modified
|
|
135
|
+
* without breaking the chain). `0` for non-window outcomes.
|
|
136
|
+
*/
|
|
137
|
+
signed_log_files_count: number;
|
|
138
|
+
/**
|
|
139
|
+
* The signed log-file inventory as a JSON array of
|
|
140
|
+
* `{s3_bucket, s3_object, hash_value, …}` — the proof page renders these so a
|
|
141
|
+
* third party can confirm WHICH files the window covers. `"[]"` for
|
|
142
|
+
* non-window outcomes.
|
|
143
|
+
*/
|
|
144
|
+
signed_log_files_json: string;
|
|
145
|
+
/**
|
|
146
|
+
* `digestEndTime` of the head digest (window upper bound). `None` unless the
|
|
147
|
+
* outcome carries a window.
|
|
148
|
+
*/
|
|
149
|
+
get window_end(): string | undefined;
|
|
150
|
+
/**
|
|
151
|
+
* `digestEndTime` of the head digest (window upper bound). `None` unless the
|
|
152
|
+
* outcome carries a window.
|
|
153
|
+
*/
|
|
154
|
+
set window_end(value: string | null | undefined);
|
|
155
|
+
/**
|
|
156
|
+
* `digestEndTime` of the starting digest reached (`Complete`) or the last
|
|
157
|
+
* verified digest before the gap (`ChainGap`). `None` otherwise.
|
|
158
|
+
*/
|
|
159
|
+
get window_start(): string | undefined;
|
|
160
|
+
/**
|
|
161
|
+
* `digestEndTime` of the starting digest reached (`Complete`) or the last
|
|
162
|
+
* verified digest before the gap (`ChainGap`). `None` otherwise.
|
|
163
|
+
*/
|
|
164
|
+
set window_start(value: string | null | undefined);
|
|
165
|
+
}
|
|
166
|
+
|
|
97
167
|
/**
|
|
98
168
|
* The kind-tagged verdict of [`verify_commitment_wasm`]. `verdict` is one of
|
|
99
169
|
* `"Valid"`, `"InvalidSignature"`, `"FingerprintMismatch"`, `"WrongAlgorithm"`,
|
|
@@ -547,6 +617,28 @@ export function verifyApprovalToken(token: Uint8Array, action_canonical: Uint8Ar
|
|
|
547
617
|
*/
|
|
548
618
|
export function verifyChain(receipts_bytes: Uint8Array): ChainResult;
|
|
549
619
|
|
|
620
|
+
/**
|
|
621
|
+
* **REJECT-MORE-ONLY.** Verify an AWS CloudTrail signed digest-file chain
|
|
622
|
+
* **offline**, proving feed completeness from the frozen bundle bytes + the
|
|
623
|
+
* PINNED AWS public keys alone — no network, no AWS call, no HESO endpoint.
|
|
624
|
+
*
|
|
625
|
+
* `proof_json` is a [`heso_action::cloudtrail::CloudTrailFeedProof`] JSON: the
|
|
626
|
+
* digest chain (HEAD FIRST), the head's out-of-band `x-amz-meta-signature`, and
|
|
627
|
+
* the pinned per-Region AWS public keys (PKCS#1 DER, base64 — exactly as
|
|
628
|
+
* `ListPublicKeys` returns them; this verifier wraps them into SPKI internally,
|
|
629
|
+
* the #1 implementation trap handled once in the kernel).
|
|
630
|
+
*
|
|
631
|
+
* The AWS key is trusted **out of band** (CT pin-the-key model): a digest whose
|
|
632
|
+
* `digestPublicKeyFingerprint` matches no pinned key FAILS with
|
|
633
|
+
* `kind = "NoMatchingKey"`. The verdict separates `feed_complete` (window
|
|
634
|
+
* completeness, claimable to a third party for this STRONG rail) from a
|
|
635
|
+
* disclosed `ChainGap` — never collapsing a gap into a green badge.
|
|
636
|
+
*
|
|
637
|
+
* Throws `[CT_PARSE]` only if `proof_json` is not a valid `CloudTrailFeedProof`;
|
|
638
|
+
* every cryptographic / chain failure is a non-throwing kind tag instead.
|
|
639
|
+
*/
|
|
640
|
+
export function verifyCloudTrailFeed(proof_json: string): CloudTrailFeedVerdict;
|
|
641
|
+
|
|
550
642
|
/**
|
|
551
643
|
* REJECT-MORE-ONLY. Verify a detached commitment-envelope signature in the
|
|
552
644
|
* browser — the recipient independently confirms a commitment the same way the
|
|
@@ -736,12 +828,30 @@ export interface InitOutput {
|
|
|
736
828
|
readonly __wbg_get_metricsverdict_card_id_matches: (a: number) => number;
|
|
737
829
|
readonly __wbg_set_metricsverdict_card_id_matches: (a: number, b: number) => void;
|
|
738
830
|
readonly verifyActionReceiptWithRates: (a: number, b: number, c: number, d: number) => number;
|
|
831
|
+
readonly __wbg_cloudtrailfeedverdict_free: (a: number, b: number) => void;
|
|
832
|
+
readonly __wbg_get_cloudtrailfeedverdict_feed_complete: (a: number) => number;
|
|
833
|
+
readonly __wbg_set_cloudtrailfeedverdict_feed_complete: (a: number, b: number) => void;
|
|
834
|
+
readonly __wbg_get_cloudtrailfeedverdict_kind: (a: number, b: number) => void;
|
|
835
|
+
readonly __wbg_set_cloudtrailfeedverdict_kind: (a: number, b: number, c: number) => void;
|
|
836
|
+
readonly __wbg_get_cloudtrailfeedverdict_digests_verified: (a: number) => number;
|
|
837
|
+
readonly __wbg_set_cloudtrailfeedverdict_digests_verified: (a: number, b: number) => void;
|
|
838
|
+
readonly __wbg_get_cloudtrailfeedverdict_window_end: (a: number, b: number) => void;
|
|
839
|
+
readonly __wbg_set_cloudtrailfeedverdict_window_end: (a: number, b: number, c: number) => void;
|
|
840
|
+
readonly __wbg_get_cloudtrailfeedverdict_window_start: (a: number, b: number) => void;
|
|
841
|
+
readonly __wbg_set_cloudtrailfeedverdict_window_start: (a: number, b: number, c: number) => void;
|
|
842
|
+
readonly __wbg_get_cloudtrailfeedverdict_signed_log_files_count: (a: number) => number;
|
|
843
|
+
readonly __wbg_set_cloudtrailfeedverdict_signed_log_files_count: (a: number, b: number) => void;
|
|
844
|
+
readonly __wbg_get_cloudtrailfeedverdict_signed_log_files_json: (a: number, b: number) => void;
|
|
845
|
+
readonly __wbg_set_cloudtrailfeedverdict_signed_log_files_json: (a: number, b: number, c: number) => void;
|
|
846
|
+
readonly verifyCloudTrailFeed: (a: number, b: number, c: number) => void;
|
|
739
847
|
readonly __wbg_set_approvaltokenclaims_decision: (a: number, b: number, c: number) => void;
|
|
740
848
|
readonly __wbg_set_approvaltokenclaims_scope: (a: number, b: number, c: number) => void;
|
|
741
849
|
readonly __wbg_set_verifieddelegation_sub: (a: number, b: number, c: number) => void;
|
|
742
850
|
readonly __wbg_set_verifieddelegation_scope: (a: number, b: number, c: number) => void;
|
|
743
851
|
readonly __wbg_set_commitmentverdict_verdict: (a: number, b: number, c: number) => void;
|
|
744
852
|
readonly __wbg_set_commitmentverdict_signer_fpr: (a: number, b: number, c: number) => void;
|
|
853
|
+
readonly __wbg_set_cloudtrailfeedverdict_broken_at: (a: number, b: number) => void;
|
|
854
|
+
readonly __wbg_get_cloudtrailfeedverdict_broken_at: (a: number) => number;
|
|
745
855
|
readonly __wbg_commitmentverdict_free: (a: number, b: number) => void;
|
|
746
856
|
readonly __wbg_get_approvaltokenclaims_decision: (a: number, b: number) => void;
|
|
747
857
|
readonly __wbg_get_approvaltokenclaims_scope: (a: number, b: number) => void;
|
package/heso_wasm.js
CHANGED
|
@@ -351,6 +351,233 @@ export class ChainResult {
|
|
|
351
351
|
}
|
|
352
352
|
if (Symbol.dispose) ChainResult.prototype[Symbol.dispose] = ChainResult.prototype.free;
|
|
353
353
|
|
|
354
|
+
/**
|
|
355
|
+
* The result of an offline CloudTrail feed-completeness check.
|
|
356
|
+
*/
|
|
357
|
+
export class CloudTrailFeedVerdict {
|
|
358
|
+
static __wrap(ptr) {
|
|
359
|
+
const obj = Object.create(CloudTrailFeedVerdict.prototype);
|
|
360
|
+
obj.__wbg_ptr = ptr;
|
|
361
|
+
CloudTrailFeedVerdictFinalization.register(obj, obj.__wbg_ptr, obj);
|
|
362
|
+
return obj;
|
|
363
|
+
}
|
|
364
|
+
__destroy_into_raw() {
|
|
365
|
+
const ptr = this.__wbg_ptr;
|
|
366
|
+
this.__wbg_ptr = 0;
|
|
367
|
+
CloudTrailFeedVerdictFinalization.unregister(this);
|
|
368
|
+
return ptr;
|
|
369
|
+
}
|
|
370
|
+
free() {
|
|
371
|
+
const ptr = this.__destroy_into_raw();
|
|
372
|
+
wasm.__wbg_cloudtrailfeedverdict_free(ptr, 0);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* 0-based head-first index at which the chain broke / a digest was rejected;
|
|
376
|
+
* `None` for `Complete`.
|
|
377
|
+
* @returns {number | undefined}
|
|
378
|
+
*/
|
|
379
|
+
get broken_at() {
|
|
380
|
+
const ret = wasm.__wbg_get_cloudtrailfeedverdict_broken_at(this.__wbg_ptr);
|
|
381
|
+
return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Number of hourly digests whose signature + chain link verified.
|
|
385
|
+
* @returns {number}
|
|
386
|
+
*/
|
|
387
|
+
get digests_verified() {
|
|
388
|
+
const ret = wasm.__wbg_get_cloudtrailfeedverdict_digests_verified(this.__wbg_ptr);
|
|
389
|
+
return ret >>> 0;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* `true` ONLY when an unbroken signed chain proved completeness back to the
|
|
393
|
+
* starting (genesis) digest — the single state that earns a third-party
|
|
394
|
+
* `feed_complete` claim. A `ChainGap` (disclosed gap) reports `false`.
|
|
395
|
+
* @returns {boolean}
|
|
396
|
+
*/
|
|
397
|
+
get feed_complete() {
|
|
398
|
+
const ret = wasm.__wbg_get_cloudtrailfeedverdict_feed_complete(this.__wbg_ptr);
|
|
399
|
+
return ret !== 0;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* The kind tag of the outcome: `"Complete"`, `"ChainGap"`, `"Empty"`,
|
|
403
|
+
* `"Malformed"`, `"NoMatchingKey"`, `"SignatureInvalid"`,
|
|
404
|
+
* `"PreviousHashMismatch"`, `"PreviousSignatureMismatch"`,
|
|
405
|
+
* `"PreviousObjectMismatch"`.
|
|
406
|
+
* @returns {string}
|
|
407
|
+
*/
|
|
408
|
+
get kind() {
|
|
409
|
+
let deferred1_0;
|
|
410
|
+
let deferred1_1;
|
|
411
|
+
try {
|
|
412
|
+
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
413
|
+
wasm.__wbg_get_cloudtrailfeedverdict_kind(retptr, this.__wbg_ptr);
|
|
414
|
+
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
415
|
+
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
416
|
+
deferred1_0 = r0;
|
|
417
|
+
deferred1_1 = r1;
|
|
418
|
+
return getStringFromWasm0(r0, r1);
|
|
419
|
+
} finally {
|
|
420
|
+
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
421
|
+
wasm.__wbindgen_export3(deferred1_0, deferred1_1, 1);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Number of signed log files the verified digests committed to across the
|
|
426
|
+
* window. For `Complete` this is the SIGNED, COMPLETE inventory the window
|
|
427
|
+
* provably covers (no log file could have been added, removed, or modified
|
|
428
|
+
* without breaking the chain). `0` for non-window outcomes.
|
|
429
|
+
* @returns {number}
|
|
430
|
+
*/
|
|
431
|
+
get signed_log_files_count() {
|
|
432
|
+
const ret = wasm.__wbg_get_cloudtrailfeedverdict_signed_log_files_count(this.__wbg_ptr);
|
|
433
|
+
return ret >>> 0;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* The signed log-file inventory as a JSON array of
|
|
437
|
+
* `{s3_bucket, s3_object, hash_value, …}` — the proof page renders these so a
|
|
438
|
+
* third party can confirm WHICH files the window covers. `"[]"` for
|
|
439
|
+
* non-window outcomes.
|
|
440
|
+
* @returns {string}
|
|
441
|
+
*/
|
|
442
|
+
get signed_log_files_json() {
|
|
443
|
+
let deferred1_0;
|
|
444
|
+
let deferred1_1;
|
|
445
|
+
try {
|
|
446
|
+
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
447
|
+
wasm.__wbg_get_cloudtrailfeedverdict_signed_log_files_json(retptr, this.__wbg_ptr);
|
|
448
|
+
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
449
|
+
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
450
|
+
deferred1_0 = r0;
|
|
451
|
+
deferred1_1 = r1;
|
|
452
|
+
return getStringFromWasm0(r0, r1);
|
|
453
|
+
} finally {
|
|
454
|
+
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
455
|
+
wasm.__wbindgen_export3(deferred1_0, deferred1_1, 1);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* `digestEndTime` of the head digest (window upper bound). `None` unless the
|
|
460
|
+
* outcome carries a window.
|
|
461
|
+
* @returns {string | undefined}
|
|
462
|
+
*/
|
|
463
|
+
get window_end() {
|
|
464
|
+
try {
|
|
465
|
+
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
466
|
+
wasm.__wbg_get_cloudtrailfeedverdict_window_end(retptr, this.__wbg_ptr);
|
|
467
|
+
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
468
|
+
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
469
|
+
let v1;
|
|
470
|
+
if (r0 !== 0) {
|
|
471
|
+
v1 = getStringFromWasm0(r0, r1).slice();
|
|
472
|
+
wasm.__wbindgen_export3(r0, r1 * 1, 1);
|
|
473
|
+
}
|
|
474
|
+
return v1;
|
|
475
|
+
} finally {
|
|
476
|
+
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* `digestEndTime` of the starting digest reached (`Complete`) or the last
|
|
481
|
+
* verified digest before the gap (`ChainGap`). `None` otherwise.
|
|
482
|
+
* @returns {string | undefined}
|
|
483
|
+
*/
|
|
484
|
+
get window_start() {
|
|
485
|
+
try {
|
|
486
|
+
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
487
|
+
wasm.__wbg_get_cloudtrailfeedverdict_window_start(retptr, this.__wbg_ptr);
|
|
488
|
+
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
489
|
+
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
490
|
+
let v1;
|
|
491
|
+
if (r0 !== 0) {
|
|
492
|
+
v1 = getStringFromWasm0(r0, r1).slice();
|
|
493
|
+
wasm.__wbindgen_export3(r0, r1 * 1, 1);
|
|
494
|
+
}
|
|
495
|
+
return v1;
|
|
496
|
+
} finally {
|
|
497
|
+
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* 0-based head-first index at which the chain broke / a digest was rejected;
|
|
502
|
+
* `None` for `Complete`.
|
|
503
|
+
* @param {number | null} [arg0]
|
|
504
|
+
*/
|
|
505
|
+
set broken_at(arg0) {
|
|
506
|
+
wasm.__wbg_set_cloudtrailfeedverdict_broken_at(this.__wbg_ptr, isLikeNone(arg0) ? Number.MAX_SAFE_INTEGER : (arg0) >>> 0);
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Number of hourly digests whose signature + chain link verified.
|
|
510
|
+
* @param {number} arg0
|
|
511
|
+
*/
|
|
512
|
+
set digests_verified(arg0) {
|
|
513
|
+
wasm.__wbg_set_cloudtrailfeedverdict_digests_verified(this.__wbg_ptr, arg0);
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* `true` ONLY when an unbroken signed chain proved completeness back to the
|
|
517
|
+
* starting (genesis) digest — the single state that earns a third-party
|
|
518
|
+
* `feed_complete` claim. A `ChainGap` (disclosed gap) reports `false`.
|
|
519
|
+
* @param {boolean} arg0
|
|
520
|
+
*/
|
|
521
|
+
set feed_complete(arg0) {
|
|
522
|
+
wasm.__wbg_set_cloudtrailfeedverdict_feed_complete(this.__wbg_ptr, arg0);
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* The kind tag of the outcome: `"Complete"`, `"ChainGap"`, `"Empty"`,
|
|
526
|
+
* `"Malformed"`, `"NoMatchingKey"`, `"SignatureInvalid"`,
|
|
527
|
+
* `"PreviousHashMismatch"`, `"PreviousSignatureMismatch"`,
|
|
528
|
+
* `"PreviousObjectMismatch"`.
|
|
529
|
+
* @param {string} arg0
|
|
530
|
+
*/
|
|
531
|
+
set kind(arg0) {
|
|
532
|
+
const ptr0 = passStringToWasm0(arg0, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
|
533
|
+
const len0 = WASM_VECTOR_LEN;
|
|
534
|
+
wasm.__wbg_set_cloudtrailfeedverdict_kind(this.__wbg_ptr, ptr0, len0);
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Number of signed log files the verified digests committed to across the
|
|
538
|
+
* window. For `Complete` this is the SIGNED, COMPLETE inventory the window
|
|
539
|
+
* provably covers (no log file could have been added, removed, or modified
|
|
540
|
+
* without breaking the chain). `0` for non-window outcomes.
|
|
541
|
+
* @param {number} arg0
|
|
542
|
+
*/
|
|
543
|
+
set signed_log_files_count(arg0) {
|
|
544
|
+
wasm.__wbg_set_cloudtrailfeedverdict_signed_log_files_count(this.__wbg_ptr, arg0);
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* The signed log-file inventory as a JSON array of
|
|
548
|
+
* `{s3_bucket, s3_object, hash_value, …}` — the proof page renders these so a
|
|
549
|
+
* third party can confirm WHICH files the window covers. `"[]"` for
|
|
550
|
+
* non-window outcomes.
|
|
551
|
+
* @param {string} arg0
|
|
552
|
+
*/
|
|
553
|
+
set signed_log_files_json(arg0) {
|
|
554
|
+
const ptr0 = passStringToWasm0(arg0, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
|
555
|
+
const len0 = WASM_VECTOR_LEN;
|
|
556
|
+
wasm.__wbg_set_cloudtrailfeedverdict_signed_log_files_json(this.__wbg_ptr, ptr0, len0);
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* `digestEndTime` of the head digest (window upper bound). `None` unless the
|
|
560
|
+
* outcome carries a window.
|
|
561
|
+
* @param {string | null} [arg0]
|
|
562
|
+
*/
|
|
563
|
+
set window_end(arg0) {
|
|
564
|
+
var ptr0 = isLikeNone(arg0) ? 0 : passStringToWasm0(arg0, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
|
565
|
+
var len0 = WASM_VECTOR_LEN;
|
|
566
|
+
wasm.__wbg_set_cloudtrailfeedverdict_window_end(this.__wbg_ptr, ptr0, len0);
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* `digestEndTime` of the starting digest reached (`Complete`) or the last
|
|
570
|
+
* verified digest before the gap (`ChainGap`). `None` otherwise.
|
|
571
|
+
* @param {string | null} [arg0]
|
|
572
|
+
*/
|
|
573
|
+
set window_start(arg0) {
|
|
574
|
+
var ptr0 = isLikeNone(arg0) ? 0 : passStringToWasm0(arg0, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
|
575
|
+
var len0 = WASM_VECTOR_LEN;
|
|
576
|
+
wasm.__wbg_set_cloudtrailfeedverdict_window_start(this.__wbg_ptr, ptr0, len0);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
if (Symbol.dispose) CloudTrailFeedVerdict.prototype[Symbol.dispose] = CloudTrailFeedVerdict.prototype.free;
|
|
580
|
+
|
|
354
581
|
/**
|
|
355
582
|
* The kind-tagged verdict of [`verify_commitment_wasm`]. `verdict` is one of
|
|
356
583
|
* `"Valid"`, `"InvalidSignature"`, `"FingerprintMismatch"`, `"WrongAlgorithm"`,
|
|
@@ -1719,6 +1946,46 @@ export function verifyChain(receipts_bytes) {
|
|
|
1719
1946
|
}
|
|
1720
1947
|
}
|
|
1721
1948
|
|
|
1949
|
+
/**
|
|
1950
|
+
* **REJECT-MORE-ONLY.** Verify an AWS CloudTrail signed digest-file chain
|
|
1951
|
+
* **offline**, proving feed completeness from the frozen bundle bytes + the
|
|
1952
|
+
* PINNED AWS public keys alone — no network, no AWS call, no HESO endpoint.
|
|
1953
|
+
*
|
|
1954
|
+
* `proof_json` is a [`heso_action::cloudtrail::CloudTrailFeedProof`] JSON: the
|
|
1955
|
+
* digest chain (HEAD FIRST), the head's out-of-band `x-amz-meta-signature`, and
|
|
1956
|
+
* the pinned per-Region AWS public keys (PKCS#1 DER, base64 — exactly as
|
|
1957
|
+
* `ListPublicKeys` returns them; this verifier wraps them into SPKI internally,
|
|
1958
|
+
* the #1 implementation trap handled once in the kernel).
|
|
1959
|
+
*
|
|
1960
|
+
* The AWS key is trusted **out of band** (CT pin-the-key model): a digest whose
|
|
1961
|
+
* `digestPublicKeyFingerprint` matches no pinned key FAILS with
|
|
1962
|
+
* `kind = "NoMatchingKey"`. The verdict separates `feed_complete` (window
|
|
1963
|
+
* completeness, claimable to a third party for this STRONG rail) from a
|
|
1964
|
+
* disclosed `ChainGap` — never collapsing a gap into a green badge.
|
|
1965
|
+
*
|
|
1966
|
+
* Throws `[CT_PARSE]` only if `proof_json` is not a valid `CloudTrailFeedProof`;
|
|
1967
|
+
* every cryptographic / chain failure is a non-throwing kind tag instead.
|
|
1968
|
+
* @param {string} proof_json
|
|
1969
|
+
* @returns {CloudTrailFeedVerdict}
|
|
1970
|
+
*/
|
|
1971
|
+
export function verifyCloudTrailFeed(proof_json) {
|
|
1972
|
+
try {
|
|
1973
|
+
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
1974
|
+
const ptr0 = passStringToWasm0(proof_json, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
|
1975
|
+
const len0 = WASM_VECTOR_LEN;
|
|
1976
|
+
wasm.verifyCloudTrailFeed(retptr, ptr0, len0);
|
|
1977
|
+
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
1978
|
+
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
1979
|
+
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
|
|
1980
|
+
if (r2) {
|
|
1981
|
+
throw takeObject(r1);
|
|
1982
|
+
}
|
|
1983
|
+
return CloudTrailFeedVerdict.__wrap(r0);
|
|
1984
|
+
} finally {
|
|
1985
|
+
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
|
|
1722
1989
|
/**
|
|
1723
1990
|
* REJECT-MORE-ONLY. Verify a detached commitment-envelope signature in the
|
|
1724
1991
|
* browser — the recipient independently confirms a commitment the same way the
|
|
@@ -2075,6 +2342,9 @@ const ApprovalTokenClaimsFinalization = (typeof FinalizationRegistry === 'undefi
|
|
|
2075
2342
|
const ChainResultFinalization = (typeof FinalizationRegistry === 'undefined')
|
|
2076
2343
|
? { register: () => {}, unregister: () => {} }
|
|
2077
2344
|
: new FinalizationRegistry(ptr => wasm.__wbg_chainresult_free(ptr, 1));
|
|
2345
|
+
const CloudTrailFeedVerdictFinalization = (typeof FinalizationRegistry === 'undefined')
|
|
2346
|
+
? { register: () => {}, unregister: () => {} }
|
|
2347
|
+
: new FinalizationRegistry(ptr => wasm.__wbg_cloudtrailfeedverdict_free(ptr, 1));
|
|
2078
2348
|
const CommitmentVerdictFinalization = (typeof FinalizationRegistry === 'undefined')
|
|
2079
2349
|
? { register: () => {}, unregister: () => {} }
|
|
2080
2350
|
: new FinalizationRegistry(ptr => wasm.__wbg_commitmentverdict_free(ptr, 1));
|
package/heso_wasm_bg.wasm
CHANGED
|
Binary file
|
package/heso_wasm_bg.wasm.d.ts
CHANGED
|
@@ -97,12 +97,30 @@ export const __wbg_set_metricsverdict_priced: (a: number, b: number) => void;
|
|
|
97
97
|
export const __wbg_get_metricsverdict_card_id_matches: (a: number) => number;
|
|
98
98
|
export const __wbg_set_metricsverdict_card_id_matches: (a: number, b: number) => void;
|
|
99
99
|
export const verifyActionReceiptWithRates: (a: number, b: number, c: number, d: number) => number;
|
|
100
|
+
export const __wbg_cloudtrailfeedverdict_free: (a: number, b: number) => void;
|
|
101
|
+
export const __wbg_get_cloudtrailfeedverdict_feed_complete: (a: number) => number;
|
|
102
|
+
export const __wbg_set_cloudtrailfeedverdict_feed_complete: (a: number, b: number) => void;
|
|
103
|
+
export const __wbg_get_cloudtrailfeedverdict_kind: (a: number, b: number) => void;
|
|
104
|
+
export const __wbg_set_cloudtrailfeedverdict_kind: (a: number, b: number, c: number) => void;
|
|
105
|
+
export const __wbg_get_cloudtrailfeedverdict_digests_verified: (a: number) => number;
|
|
106
|
+
export const __wbg_set_cloudtrailfeedverdict_digests_verified: (a: number, b: number) => void;
|
|
107
|
+
export const __wbg_get_cloudtrailfeedverdict_window_end: (a: number, b: number) => void;
|
|
108
|
+
export const __wbg_set_cloudtrailfeedverdict_window_end: (a: number, b: number, c: number) => void;
|
|
109
|
+
export const __wbg_get_cloudtrailfeedverdict_window_start: (a: number, b: number) => void;
|
|
110
|
+
export const __wbg_set_cloudtrailfeedverdict_window_start: (a: number, b: number, c: number) => void;
|
|
111
|
+
export const __wbg_get_cloudtrailfeedverdict_signed_log_files_count: (a: number) => number;
|
|
112
|
+
export const __wbg_set_cloudtrailfeedverdict_signed_log_files_count: (a: number, b: number) => void;
|
|
113
|
+
export const __wbg_get_cloudtrailfeedverdict_signed_log_files_json: (a: number, b: number) => void;
|
|
114
|
+
export const __wbg_set_cloudtrailfeedverdict_signed_log_files_json: (a: number, b: number, c: number) => void;
|
|
115
|
+
export const verifyCloudTrailFeed: (a: number, b: number, c: number) => void;
|
|
100
116
|
export const __wbg_set_approvaltokenclaims_decision: (a: number, b: number, c: number) => void;
|
|
101
117
|
export const __wbg_set_approvaltokenclaims_scope: (a: number, b: number, c: number) => void;
|
|
102
118
|
export const __wbg_set_verifieddelegation_sub: (a: number, b: number, c: number) => void;
|
|
103
119
|
export const __wbg_set_verifieddelegation_scope: (a: number, b: number, c: number) => void;
|
|
104
120
|
export const __wbg_set_commitmentverdict_verdict: (a: number, b: number, c: number) => void;
|
|
105
121
|
export const __wbg_set_commitmentverdict_signer_fpr: (a: number, b: number, c: number) => void;
|
|
122
|
+
export const __wbg_set_cloudtrailfeedverdict_broken_at: (a: number, b: number) => void;
|
|
123
|
+
export const __wbg_get_cloudtrailfeedverdict_broken_at: (a: number) => number;
|
|
106
124
|
export const __wbg_commitmentverdict_free: (a: number, b: number) => void;
|
|
107
125
|
export const __wbg_get_approvaltokenclaims_decision: (a: number, b: number) => void;
|
|
108
126
|
export const __wbg_get_approvaltokenclaims_scope: (a: number, b: number) => void;
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hesohq/verify-wasm",
|
|
3
|
-
"version": "0.5.0-dev.
|
|
3
|
+
"version": "0.5.0-dev.81",
|
|
4
4
|
"description": "HESO Enterprise trust layer — browser WASM verify-only surface (ESM)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"prepublishOnly": "for sym in l1CosignPayload quorumCosignPayload verifyActionReceipt verifyInclusion verifyConsistency verifyReveal; do for f in heso_wasm.js heso_wasm.d.ts heso_wasm_bg.wasm.d.ts heso_wasm_bg.wasm; do grep -aq \"$sym\" \"$f\" || { echo \"prepublishOnly: $sym missing from $f — stale artifact, run \\`just wasm\\` from heso-enterprise root\" >&2; exit 1; }; done; done; echo \"prepublishOnly: l1CosignPayload + quorumCosignPayload + verifyActionReceipt + verifyInclusion + verifyConsistency + verifyReveal present in all artifacts\"",
|
|
7
|
+
"prepublishOnly": "for sym in l1CosignPayload quorumCosignPayload verifyActionReceipt verifyInclusion verifyConsistency verifyReveal verifyCloudTrailFeed; do for f in heso_wasm.js heso_wasm.d.ts heso_wasm_bg.wasm.d.ts heso_wasm_bg.wasm; do grep -aq \"$sym\" \"$f\" || { echo \"prepublishOnly: $sym missing from $f — stale artifact, run \\`just wasm\\` from heso-enterprise root\" >&2; exit 1; }; done; done; echo \"prepublishOnly: l1CosignPayload + quorumCosignPayload + verifyActionReceipt + verifyInclusion + verifyConsistency + verifyReveal + verifyCloudTrailFeed present in all artifacts\"",
|
|
8
8
|
"bundle:make": "node scripts/make-bundle.mjs",
|
|
9
9
|
"verify:offline": "node scripts/assert-no-network-runtime.mjs",
|
|
10
10
|
"verify:offline:docker": "bash scripts/verify-offline-docker.sh",
|