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