@peac/protocol 0.13.3 → 0.14.0

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 (33) hide show
  1. package/dist/_internal/record-core/bounded-validator.d.ts +65 -29
  2. package/dist/_internal/record-core/bounded-validator.d.ts.map +1 -1
  3. package/dist/_internal/record-core/validation-gate.d.ts +102 -0
  4. package/dist/_internal/record-core/validation-gate.d.ts.map +1 -0
  5. package/dist/_internal/record-core/validators/iat-not-yet-valid.d.ts +29 -0
  6. package/dist/_internal/record-core/validators/iat-not-yet-valid.d.ts.map +1 -0
  7. package/dist/_internal/record-core/validators/index.d.ts +7 -0
  8. package/dist/_internal/record-core/validators/index.d.ts.map +1 -1
  9. package/dist/_internal/record-core/validators/jose-typ-strictness.d.ts +39 -0
  10. package/dist/_internal/record-core/validators/jose-typ-strictness.d.ts.map +1 -0
  11. package/dist/_internal/record-core/validators/policy-binding.d.ts +33 -0
  12. package/dist/_internal/record-core/validators/policy-binding.d.ts.map +1 -0
  13. package/dist/_internal/record-core/validators/schema-parse.d.ts +72 -0
  14. package/dist/_internal/record-core/validators/schema-parse.d.ts.map +1 -0
  15. package/dist/_internal/record-core/validators/signature.d.ts +31 -0
  16. package/dist/_internal/record-core/validators/signature.d.ts.map +1 -0
  17. package/dist/_internal/record-core/validators/type-extension-enforcement.d.ts +42 -0
  18. package/dist/_internal/record-core/validators/type-extension-enforcement.d.ts.map +1 -0
  19. package/dist/_internal/record-core/validators/unknown-extension-grammar.d.ts +39 -0
  20. package/dist/_internal/record-core/validators/unknown-extension-grammar.d.ts.map +1 -0
  21. package/dist/_internal/test-helpers/candidate-runner.d.ts +52 -0
  22. package/dist/_internal/test-helpers/candidate-runner.d.ts.map +1 -0
  23. package/dist/index.cjs +360 -59
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.mjs +360 -59
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/issue.d.ts.map +1 -1
  28. package/dist/verify-local.cjs +285 -18
  29. package/dist/verify-local.cjs.map +1 -1
  30. package/dist/verify-local.d.ts.map +1 -1
  31. package/dist/verify-local.mjs +285 -18
  32. package/dist/verify-local.mjs.map +1 -1
  33. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"verify-local.d.ts","sourceRoot":"","sources":["../src/verify-local.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify-local.d.ts","sourceRoot":"","sources":["../src/verify-local.ts"],"names":[],"mappings":"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"}
@@ -338,6 +338,112 @@ function validateExtensionBudgetInternal(extensions) {
338
338
  if (violations.length === 0) return ACCEPTED4;
339
339
  return { accepted: false, violations };
340
340
  }
341
+ function validateSchemaParseInternal(payload) {
342
+ const pr = parseReceiptClaims(payload);
343
+ if (!pr.ok) {
344
+ return {
345
+ accepted: false,
346
+ errorCode: pr.error.code,
347
+ errorMessage: pr.error.message,
348
+ ...pr.error.issues !== void 0 && { errorIssues: pr.error.issues }
349
+ };
350
+ }
351
+ if (pr.wireVersion !== "0.2") {
352
+ return {
353
+ accepted: false,
354
+ errorCode: "E_UNSUPPORTED_WIRE_VERSION",
355
+ errorMessage: `Unsupported wire version: ${pr.wireVersion}`
356
+ };
357
+ }
358
+ return {
359
+ accepted: true,
360
+ claims: pr.claims,
361
+ wireVersion: "0.2",
362
+ warnings: pr.warnings
363
+ };
364
+ }
365
+
366
+ // src/_internal/record-core/validators/jose-typ-strictness.ts
367
+ var ACCEPTED_NO_WARN = { accepted: true };
368
+ var ACCEPTED_TYP_MISSING = {
369
+ accepted: true,
370
+ warnings: [{ code: "typ_missing" }]
371
+ };
372
+ var REJECTED_INVALID_FORMAT = {
373
+ accepted: false,
374
+ errorCode: "E_INVALID_FORMAT"
375
+ };
376
+ function validateJoseTypStrictnessInternal(typ, strictness) {
377
+ const present = typeof typ === "string" && typ.length > 0;
378
+ if (present) return ACCEPTED_NO_WARN;
379
+ if (strictness === "strict") return REJECTED_INVALID_FORMAT;
380
+ return ACCEPTED_TYP_MISSING;
381
+ }
382
+
383
+ // src/_internal/record-core/validators/iat-not-yet-valid.ts
384
+ var ACCEPTED5 = { accepted: true };
385
+ var REJECTED2 = {
386
+ accepted: false,
387
+ errorCode: "E_NOT_YET_VALID"
388
+ };
389
+ function validateIatNotYetValidInternal(iat, now, maxClockSkew) {
390
+ if (iat > now + maxClockSkew) return REJECTED2;
391
+ return ACCEPTED5;
392
+ }
393
+ function validatePolicyBindingInternal(receiptPolicyDigest, localPolicyDigest) {
394
+ if (receiptPolicyDigest === void 0 || localPolicyDigest === void 0) {
395
+ return { accepted: true, status: "unavailable" };
396
+ }
397
+ const status = verifyPolicyBinding(receiptPolicyDigest, localPolicyDigest);
398
+ if (status === "failed") {
399
+ return { accepted: false, errorCode: "E_POLICY_BINDING_FAILED", status };
400
+ }
401
+ return { accepted: true, status };
402
+ }
403
+ var ACCEPTED_EMPTY = {
404
+ accepted: true,
405
+ warnings: []
406
+ };
407
+ function escapeJsonPointer(token) {
408
+ return token.replace(/~/g, "~0").replace(/\//g, "~1");
409
+ }
410
+ function validateUnknownExtensionGrammarInternal(extensions) {
411
+ if (extensions === void 0) return ACCEPTED_EMPTY;
412
+ const keys = Object.keys(extensions);
413
+ if (keys.length === 0) return ACCEPTED_EMPTY;
414
+ const warnings = [];
415
+ for (const key of keys) {
416
+ if (!REGISTERED_EXTENSION_GROUP_KEYS.has(key) && isValidExtensionKey(key)) {
417
+ warnings.push({
418
+ code: "unknown_extension_preserved",
419
+ pointer: `/extensions/${escapeJsonPointer(key)}`
420
+ });
421
+ }
422
+ }
423
+ return { accepted: true, warnings };
424
+ }
425
+ var ACCEPTED_NO_WARN2 = { accepted: true };
426
+ function validateTypeExtensionEnforcementInternal(kind, type, extensions, strictness) {
427
+ const result = checkTypeExtensionMapping(
428
+ kind,
429
+ type,
430
+ extensions,
431
+ TYPE_TO_EXTENSION_MAP,
432
+ REGISTERED_EXTENSION_GROUP_KEYS
433
+ );
434
+ if (result.status === "ok" || result.status === "skip") {
435
+ return ACCEPTED_NO_WARN2;
436
+ }
437
+ if (strictness === "strict") {
438
+ const errorCode = result.status === "missing" ? "E_EXTENSION_GROUP_REQUIRED" : "E_EXTENSION_GROUP_MISMATCH";
439
+ return { accepted: false, errorCode, pointer: "/type" };
440
+ }
441
+ const warningCode = result.status === "missing" ? "extension_group_missing" : "extension_group_mismatch";
442
+ return {
443
+ accepted: true,
444
+ warnings: [{ code: warningCode, pointer: "/type" }]
445
+ };
446
+ }
341
447
 
342
448
  // src/_internal/record-core/bounded-validator.ts
343
449
  function runBoundedValidatorShadow(input) {
@@ -397,12 +503,139 @@ function runBoundedValidatorShadow(input) {
397
503
  violations.push({ layer: "extension-budget", code: v.code, path: v.path });
398
504
  }
399
505
  }
506
+ if (input.fullClaims !== void 0) {
507
+ const schemaRes = validateSchemaParseInternal(input.fullClaims);
508
+ if (!schemaRes.accepted && schemaRes.errorCode !== void 0) {
509
+ violations.push({ layer: "schema-parse", code: schemaRes.errorCode });
510
+ }
511
+ }
512
+ if (input.header !== void 0 && input.strictness !== void 0) {
513
+ const typRes = validateJoseTypStrictnessInternal(input.header.typ, input.strictness);
514
+ if (!typRes.accepted) {
515
+ violations.push({ layer: "jose-typ-strictness", code: typRes.errorCode });
516
+ } else if (typRes.warnings) {
517
+ for (const w of typRes.warnings) {
518
+ warnings.push({ layer: "jose-typ-strictness", code: w.code });
519
+ }
520
+ }
521
+ }
522
+ if (input.maxClockSkew !== void 0) {
523
+ const iatRes = validateIatNotYetValidInternal(input.claims.iat, input.now, input.maxClockSkew);
524
+ if (!iatRes.accepted && iatRes.errorCode !== void 0) {
525
+ violations.push({ layer: "iat-not-yet-valid", code: iatRes.errorCode });
526
+ }
527
+ }
528
+ if (input.receiptPolicyDigest !== void 0 && input.localPolicyDigest !== void 0) {
529
+ const policyRes = validatePolicyBindingInternal(
530
+ input.receiptPolicyDigest,
531
+ input.localPolicyDigest
532
+ );
533
+ if (!policyRes.accepted && policyRes.errorCode !== void 0) {
534
+ violations.push({ layer: "policy-binding", code: policyRes.errorCode });
535
+ }
536
+ }
537
+ const unknownExtRes = validateUnknownExtensionGrammarInternal(input.claims.extensions);
538
+ for (const w of unknownExtRes.warnings) {
539
+ warnings.push({
540
+ layer: "unknown-extension-grammar",
541
+ code: w.code,
542
+ path: w.pointer
543
+ });
544
+ }
545
+ if (input.strictness !== void 0) {
546
+ const enforceRes = validateTypeExtensionEnforcementInternal(
547
+ input.claims.kind,
548
+ input.claims.type,
549
+ input.claims.extensions,
550
+ input.strictness
551
+ );
552
+ if (!enforceRes.accepted) {
553
+ violations.push({
554
+ layer: "type-extension-enforcement",
555
+ code: enforceRes.errorCode,
556
+ path: enforceRes.pointer
557
+ });
558
+ } else if (enforceRes.warnings) {
559
+ for (const w of enforceRes.warnings) {
560
+ warnings.push({
561
+ layer: "type-extension-enforcement",
562
+ code: w.code,
563
+ path: w.pointer
564
+ });
565
+ }
566
+ }
567
+ }
400
568
  return {
401
569
  accepted: violations.length === 0,
402
570
  violations,
403
571
  warnings
404
572
  };
405
573
  }
574
+ var MAX_SANITIZED_ISSUES = 25;
575
+ function sanitizeIssues(issues) {
576
+ if (!Array.isArray(issues)) return void 0;
577
+ return issues.slice(0, MAX_SANITIZED_ISSUES).map((issue) => {
578
+ const candidate = issue;
579
+ const path = Array.isArray(candidate.path) ? candidate.path.map(
580
+ (segment) => typeof segment === "string" || typeof segment === "number" ? String(segment) : ""
581
+ ).join(".") : "";
582
+ const message = typeof candidate.message === "string" ? candidate.message : String(candidate.message ?? issue);
583
+ return { path, message };
584
+ });
585
+ }
586
+ function runBoundedValidationGate(input) {
587
+ return runVerifyLocal(input.payload);
588
+ }
589
+ function runVerifyLocal(payload) {
590
+ const kernelRes = validateKernelConstraints(payload);
591
+ if (!kernelRes.valid) {
592
+ const v = kernelRes.violations[0];
593
+ return {
594
+ ok: false,
595
+ code: "E_CONSTRAINT_VIOLATION",
596
+ message: `Kernel constraint violated: ${v.constraint} (actual: ${v.actual}, limit: ${v.limit})`
597
+ };
598
+ }
599
+ const schemaRes = validateSchemaParseInternal(payload);
600
+ if (!schemaRes.accepted) {
601
+ if (schemaRes.errorCode === "E_UNSUPPORTED_WIRE_VERSION") {
602
+ return {
603
+ ok: false,
604
+ code: "E_UNSUPPORTED_WIRE_VERSION",
605
+ message: "Wire 0.1 receipts are not supported. Re-issue as Wire 0.2 using issue()."
606
+ };
607
+ }
608
+ const sanitized = sanitizeIssues(schemaRes.errorIssues);
609
+ const details = {};
610
+ if (schemaRes.errorCode !== void 0) {
611
+ Object.assign(details, { parse_code: schemaRes.errorCode });
612
+ }
613
+ if (sanitized !== void 0) {
614
+ Object.assign(details, { issues: sanitized });
615
+ }
616
+ return {
617
+ ok: false,
618
+ code: "E_INVALID_FORMAT",
619
+ message: `Receipt schema validation failed: ${schemaRes.errorMessage ?? "unknown"}`,
620
+ ...Object.keys(details).length > 0 && { details }
621
+ };
622
+ }
623
+ if (schemaRes.wireVersion !== "0.2" || schemaRes.claims === void 0) {
624
+ return {
625
+ ok: false,
626
+ code: "E_UNSUPPORTED_WIRE_VERSION",
627
+ message: "Wire 0.1 receipts are not supported. Re-issue as Wire 0.2 using issue()."
628
+ };
629
+ }
630
+ return {
631
+ ok: true,
632
+ parsed: {
633
+ wireVersion: "0.2",
634
+ claims: schemaRes.claims,
635
+ parserWarnings: schemaRes.warnings ?? []
636
+ }
637
+ };
638
+ }
406
639
  var SECRET_PATTERNS = [
407
640
  // Compact JWS / JWT (header.payload.signature with eyJ-prefixed header).
408
641
  /eyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,
@@ -682,7 +915,7 @@ function sanitizeParseIssues(issues) {
682
915
  }));
683
916
  }
684
917
  async function verifyLocal(jws, publicKey, options = {}) {
685
- void readLegacyPathFlag(options);
918
+ const legacyPath = readLegacyPathFlag(options);
686
919
  const {
687
920
  issuer,
688
921
  subjectUri,
@@ -715,22 +948,56 @@ async function verifyLocal(jws, publicKey, options = {}) {
715
948
  message: "JWS typ header is absent; accepted in interop mode"
716
949
  });
717
950
  }
718
- const constraintResult = validateKernelConstraints(result.payload);
719
- if (!constraintResult.valid) {
720
- const v = constraintResult.violations[0];
721
- return {
722
- valid: false,
723
- code: "E_CONSTRAINT_VIOLATION",
724
- message: `Kernel constraint violated: ${v.constraint} (actual: ${v.actual}, limit: ${v.limit})`
725
- };
726
- }
727
- const pr = parseReceiptClaims(result.payload);
728
- if (!pr.ok) {
729
- return {
730
- valid: false,
731
- code: "E_INVALID_FORMAT",
732
- message: `Receipt schema validation failed: ${pr.error.message}`,
733
- details: { parse_code: pr.error.code, issues: sanitizeParseIssues(pr.error.issues) }
951
+ let pr;
952
+ if (legacyPath) {
953
+ const constraintResult = validateKernelConstraints(result.payload);
954
+ if (!constraintResult.valid) {
955
+ const v = constraintResult.violations[0];
956
+ return {
957
+ valid: false,
958
+ code: "E_CONSTRAINT_VIOLATION",
959
+ message: `Kernel constraint violated: ${v.constraint} (actual: ${v.actual}, limit: ${v.limit})`
960
+ };
961
+ }
962
+ const parsed = parseReceiptClaims(result.payload);
963
+ if (!parsed.ok) {
964
+ return {
965
+ valid: false,
966
+ code: "E_INVALID_FORMAT",
967
+ message: `Receipt schema validation failed: ${parsed.error.message}`,
968
+ details: {
969
+ parse_code: parsed.error.code,
970
+ issues: sanitizeParseIssues(parsed.error.issues)
971
+ }
972
+ };
973
+ }
974
+ pr = parsed;
975
+ } else {
976
+ const gateResult = runBoundedValidationGate({
977
+ surface: "verifyLocal",
978
+ payload: result.payload
979
+ });
980
+ if (!gateResult.ok) {
981
+ return {
982
+ valid: false,
983
+ code: gateResult.code,
984
+ message: gateResult.message,
985
+ ...gateResult.details !== void 0 && { details: gateResult.details }
986
+ };
987
+ }
988
+ const parsedFromGate = gateResult.parsed;
989
+ if (parsedFromGate === void 0) {
990
+ return {
991
+ valid: false,
992
+ code: "E_INTERNAL",
993
+ message: "Bounded validation gate accepted without surfacing parsed claims"
994
+ };
995
+ }
996
+ pr = {
997
+ ok: true,
998
+ wireVersion: parsedFromGate.wireVersion,
999
+ warnings: parsedFromGate.parserWarnings,
1000
+ claims: parsedFromGate.claims
734
1001
  };
735
1002
  }
736
1003
  if (pr.wireVersion === "0.2") {
@@ -847,7 +1114,7 @@ async function verifyLocal(jws, publicKey, options = {}) {
847
1114
  ...callerBindings?.documents !== void 0 && callerBindings.documents.length > 0 && { documents: callerBindings.documents }
848
1115
  };
849
1116
  const sortedWarnings = sortWarnings(accumulatedWarnings);
850
- if (isShadowEnabled(options)) {
1117
+ if (legacyPath && isShadowEnabled(options)) {
851
1118
  const headerSnapshot = { ...result.header };
852
1119
  scheduleShadow({
853
1120
  call: "verifyLocal",