proofbundle 3.8.0__tar.gz → 4.0.0__tar.gz
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.
- {proofbundle-3.8.0/src/proofbundle.egg-info → proofbundle-4.0.0}/PKG-INFO +1 -1
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/AUDITOR_OPEN_POINTS.md +4 -3
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/MANIFEST.sha256 +2 -2
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/PROGRESS.md +6 -4
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/proofbundle/readiness_pack.bundle.json +4 -4
- proofbundle-4.0.0/docs/readiness_pack/proofbundle/readiness_pack.pub.b64 +1 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/pyproject.toml +1 -1
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/claims_hygiene_check.py +4 -3
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/__init__.py +1 -1
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_rootcommit.py +15 -2
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/checkpoint.py +229 -26
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/cli.py +18 -2
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/public_transparency.py +15 -1
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/tlogproof.py +28 -8
- {proofbundle-3.8.0 → proofbundle-4.0.0/src/proofbundle.egg-info}/PKG-INFO +1 -1
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle.egg-info/SOURCES.txt +3 -0
- proofbundle-4.0.0/tests/fixtures/anchors/markovian_log/checkpoint_7397/MANIFEST.json +36 -0
- proofbundle-4.0.0/tests/fixtures/anchors/markovian_log/checkpoint_7397/checkpoint_7397.txt +15 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/ERGEBNIS.json +14 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/ERGEBNIS_negativ.json +14 -0
- proofbundle-4.0.0/tests/fixtures/anchors/markovian_log/proof_7271/MANIFEST.json +143 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/README.md +28 -14
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/SOURCES.md +20 -8
- proofbundle-4.0.0/tests/fixtures/anchors/markovian_log/proof_7271/keys_unabhaengig.txt +20 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_markovian_log.py +102 -45
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_bughunt_361_never_raise.py +1 -1
- proofbundle-4.0.0/tests/test_origin_quorum_rule.py +716 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_verify_proof_expected_origin.py +93 -54
- proofbundle-3.8.0/docs/readiness_pack/proofbundle/readiness_pack.pub.b64 +0 -1
- proofbundle-3.8.0/tests/fixtures/anchors/markovian_log/proof_7271/MANIFEST.json +0 -116
- proofbundle-3.8.0/tests/fixtures/anchors/markovian_log/proof_7271/keys_unabhaengig.txt +0 -16
- {proofbundle-3.8.0 → proofbundle-4.0.0}/LICENSE +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/MANIFEST.in +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/README.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/README.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/coherent-rewrap-fails-expected-root/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/coherent-rewrap-fails-expected-root/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/coherent-rewrap-verifies-no-policy/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/coherent-rewrap-verifies-no-policy/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/corrupted-signature/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/corrupted-signature/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/duplicate-json-key/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/duplicate-json-key/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/forged-anchor-own-frozen/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/forged-anchor-own-frozen/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/n1-eval-sdjwt-graft-non-eval/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/n1-eval-sdjwt-graft-non-eval/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-forged-issuer-identity/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-forged-issuer-identity/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-signed-but-unbound/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-signed-but-unbound/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-unsigned-unauthenticated/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-unsigned-unauthenticated/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/tampered-payload/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/tampered-payload/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/tree-size-expectation-mismatch/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/tree-size-expectation-mismatch/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/valid-minimal/bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/valid-minimal/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/common_vocabulary.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/cross_format.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/MANIFEST.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.jcs +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.jcs.ots +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/evidence_eval_result.jcs +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/evidence_eval_result.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/MANIFEST.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.jcs +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.jcs.ots +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/evidence_eval_result.jcs +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/evidence_eval_result.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/MANIFEST.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/decision_receipt.jcs +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/decision_receipt.jcs.ots +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/decision_receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/evidence_eval_result.jcs +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/evidence_eval_result.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/manifest.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-supersedes-verified/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-supersedes-verified/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-supersedes-verified/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-supersedes-verified/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-unresolved/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-unresolved/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-unresolved/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-accept-path/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-accept-path/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-accept-path/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-accept-path/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-accept-path/related_rx.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/related_r0.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/related_rx.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/related_r0.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/related_rx.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/related_r0.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/related_rx.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_001.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_002.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_003.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_004.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_005.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_006.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_007.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_008.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_009.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_010.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_011.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_012.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_013.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_014.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_015.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_016.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_017.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_018.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_019.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_020.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_021.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_022.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_023.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_024.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_025.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_026.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_027.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_028.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_029.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_030.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_031.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_032.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_033.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/digest-mismatch/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/digest-mismatch/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/digest-mismatch/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/digest-mismatch/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/digest-mismatch/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/generate_vectors.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/malformed-digest/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/malformed-digest/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/malformed-digest/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-declared-supersedes-verified/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-declared-supersedes-verified/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-declared-supersedes-verified/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-declared-supersedes-verified/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/related_r0.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/related_rx.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-digest-mismatch/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-digest-mismatch/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-digest-mismatch/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-digest-mismatch/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-digest-mismatch/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-relation-signer-unauthorized/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-relation-signer-unauthorized/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-relation-signer-unauthorized/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-relation-signer-unauthorized/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-relation-signer-unauthorized/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-renews/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-renews/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-renews/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-renews/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-silent-landing/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-silent-landing/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-silent-landing/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-valid-baseline/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-valid-baseline/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-valid-baseline/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-amends/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-amends/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-amends/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-amends/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-corrects/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-corrects/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-corrects/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-corrects/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-derivedfrom/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-derivedfrom/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-derivedfrom/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-derivedfrom/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-retracts/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-retracts/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-retracts/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-retracts/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-revises/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-revises/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-revises/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-revises/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-unauthorized/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-unauthorized/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-unauthorized/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-unauthorized/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-unauthorized/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-verified/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-verified/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-verified/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-verified/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-verified/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-same-key-explicit/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-same-key-explicit/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-same-key-explicit/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-same-key-explicit/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-same-key-explicit/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-verified-under-not-claim/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-verified-under-not-claim/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-verified-under-not-claim/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-verified-under-not-claim/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-verified-under-not-claim/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/renews-vector/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/renews-vector/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/renews-vector/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/renews-vector/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/retracts-then-use/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/retracts-then-use/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/retracts-then-use/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/retracts-then-use/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/retracts-then-use/related_r.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/silent-landing/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/silent-landing/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/silent-landing/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-malformed/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-malformed/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-malformed/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-declared-unresolved/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-declared-unresolved/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-declared-unresolved/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-unauthorized/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-unauthorized/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-unauthorized/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-unauthorized/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-unauthorized/related_t.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-blocked/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-blocked/policy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-blocked/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-blocked/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-blocked/related_t.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-visible/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-visible/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-visible/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-visible/related_t.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-supersedes-verified/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-supersedes-verified/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-supersedes-verified/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-supersedes-verified/related_t.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/t1-canonical-invalid-signature/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/t1-canonical-invalid-signature/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/t1-canonical-invalid-signature/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-ambiguous/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-ambiguous/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-ambiguous/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-ambiguous/related_r0.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-correct-pass/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-correct-pass/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-correct-pass/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-correct-pass/related_r0.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-mismatch/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-mismatch/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-mismatch/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-mismatch/related_r0.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-missing/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-missing/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-missing/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-missing/related_r0.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/unauthorized-signer/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/unauthorized-signer/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/unauthorized-signer/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/unauthorized-signer/related_b.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/valid-baseline/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/valid-baseline/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/valid-baseline/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/wrong-payloadtype-target/case.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/wrong-payloadtype-target/pub.b64 +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/wrong-payloadtype-target/receipt.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/wrong-payloadtype-target/related_t.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/run_conformance.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/vector_schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/adr/renewal_policy.example.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/OPEN_QUESTIONS.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/README.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/REPRODUCTION_RUNBOOK.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/calendar_independence.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/differential_matrix.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/index.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/rust_parity_scope.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/tamper_resistance.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/threat_model_delta_360.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/README.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/anchors/chia-datalayer-invalid-root.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/anchors/chia-datalayer-valid.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/checkpoint_example.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/decision_receipt_allow.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/decision_receipt_deny.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/decision_receipt_escalate.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/decision_receipt_with_eval_ref.intoto.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/eee_receipt.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/example.tlog-proof +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/example_bundle.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/experimental_enclave.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/inspect_hook_example.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/inspect_receipt.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/intoto/private-model-commitment.statement.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/intoto/public-model.statement.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/intoto/release-gate.statement.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/intoto/svr.statement.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/intoto_dsse_export.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/lm_eval_receipt.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/make_example.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/persample_audit.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/pytest_plugin_example.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/rekor_interop.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/tlog_proof_example.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/trust_policy_decision_strict.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/trust_policy_strict.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/formal/README.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/formal/model.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/action-outcome-v0.1.schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/decision-receipt-v0.1.schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/eval_claim_v0_1.schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/in_toto_statement_v1.schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/proofbundle_v0_1.schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/run-ledger-v0.1.schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/trust-pack-v0.1.schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/trust_policy_v0_1.schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/verification-summary-v0.1.schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/_build_anchor_fixture.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/audit_candidate_matrix.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/branch_base_check.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/build_reproducible.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/check_version_and_changelog.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/demo.sh +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/demo_tamper.sh +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/doc_link_check.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/finding_base_drift.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/findings_register.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/fork_pr_secret_isolation.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/fuzz_soak.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/gen_findings_register.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/gen_synthetic_ots_fixture.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/git-hooks/pre-commit +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/install_git_hooks.sh +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/mutant_signature_guard.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/mutation_check.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/pre_tag_attestation.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/pre_tag_audit_gate.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/readiness_pack_gate.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/readiness_pack_manifest.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/render_demo.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/rust_parity_gate.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/rust_parity_registry.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/test_manifest_gate.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/type_confusion_gate.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/setup.cfg +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/_inspect_registry.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/_integration.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/_strict_json.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/__init__.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/_provenance.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/eee.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/inspect_ai.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/lm_eval.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/promptfoo.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/samples.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_chia.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_chia_add.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_markovian.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_ots.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_rfc3161.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/assurance.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/automation_verdict.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/beacon.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/budget.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/bundle.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/canonical.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/decision.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/demo.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/dsse.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/eee_eval_schema.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/emit.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/errors.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/evalcard.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/evalclaim.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/evidence_pack.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/experimental/__init__.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/experimental/enclave.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/hashalg.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/hf_evals.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/inspect_hook.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/intoto.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/kbjwt.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/merkle.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/outcome.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/persample.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policies/decision-receipt-template-v1.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policies/research-preview-v1.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policies/strict-eval-authenticated-root-template-v1.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policies/strict-eval-template-v1.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policies/strict-prereg-template-v1.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policy.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policy_profiles.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/pqsig.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/prereg.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/py.typed +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/pytest_plugin.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/relation.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/relation_statement.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/renewal.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/run_ledger.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/sdjwt.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/sdjwt_issue.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/sdjwt_vc.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/signature.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/statuslist.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/subject_binding.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/trust_pack.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/verification_summary.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle.egg-info/dependency_links.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle.egg-info/entry_points.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle.egg-info/requires.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle.egg-info/top_level.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/_beinahe_treffer.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/conftest.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/chia_datalayer_proof.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/freetsa_receipt_anchor.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/leaf_7271.raw +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/proof_7271.tlog-proof +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/MANIFEST.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/README.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/MANIFEST.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/README.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors/manifest.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors/rootcommit-01-valid.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors/rootcommit-02-tampered-root.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors/rootcommit-03-tampered-wallet.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors/rootcommit-04-tampered-proof.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/manifest.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/v2sig-01-valid.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/v2sig-02-tampered-root.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/v2sig-03-tampered-wallet.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/v2sig-04-tampered-sig.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/v2sig-05-tampered-proof.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/vectors/01-valid.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/vectors/02-unknown-id.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/vectors/03-tampered-body.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/vectors/04-tampered-proof.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/vectors/manifest.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/checkpoint/PROVENANCE.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/checkpoint/gosumdb_known_keys.go +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/checkpoint/rekor_v2_checkpoint.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/checkpoint/sumdb_latest.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/checkpoint/trusted_root.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ed25519_speccheck_cases.LICENSE +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ed25519_speccheck_cases.README.md +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ed25519_speccheck_cases.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/eee_arc_easy.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/inspect_logs/safety_refusal_demo.eval +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/lm_eval_arc_easy_real.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/markovian_anchor_confirmed.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/mldsa_acvp/PROVENANCE.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/mldsa_acvp/mldsa_sigver_slice.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/PROVENANCE.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/block358391.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/hello-world.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/hello-world.txt.ots +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/incomplete.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/incomplete.txt.ots +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/known-and-unknown-notary.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/known-and-unknown-notary.txt.ots +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/merkle2.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/merkle2.txt.ots +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/synthetic-upgraded-sha256.block.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/synthetic-upgraded-sha256.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/synthetic-upgraded-sha256.txt.ots +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/two-calendars.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/two-calendars.txt.ots +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/promptfoo_results_v3.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/rekor_inclusion_25579.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/rfc6962_vectors.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/sdjwt_disclosure_vector.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/sdjwt_reference_eddsa.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/sdjwtvc/PROVENANCE.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/sdjwtvc/sdjwtvc_examples.txt +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/sdjwtvc/sdjwtvc_issuer_pubkey.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_adapters.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_adversarial.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchor_hardening_321.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchor_longevity_property.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchor_target_trustedtime.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_chia.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_chia_add.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_chia_claims.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_generic.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_markovian.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_ots.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_rfc3161.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_rfc3161_type_floor.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_rootcommit.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_assurance.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_audit_candidate_360.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_audit_index_zahlen_stimmen.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_audit_marker_line_wrap.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_automation_verdict.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_beacon.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_branch_base_check.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_budget.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_bughunt_361_automation_failopen.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_bundle.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_bundle_robustness.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_canonical.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_checkpoint.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_checkpoint_external_vectors.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_checkpoint_quorum_property.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_claims_hygiene.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cli.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cli_eval.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cli_require_anchor.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_conformance.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_conformance_retention_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_content_root_property.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cosignature.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cosignature_mldsa.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cross_format_singleton_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_anchors.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_cli.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_evidence.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_fuzz.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_hardening.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_policy.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_schema.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_validator_api.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_verify.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_demo.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_docs_truth.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_dsse_adversarial.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_dup_key_reject.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_ed25519_semantics.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_eee.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_emit.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_enclave_assurance.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_erwartungsvergleich_population_guard.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_eval_claim_schema.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_eval_evidence_class.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_evalcard.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_evalclaim.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_evidence_pack.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_examples.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_experimental_enclave.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_findings_register_identity_axis.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_findings_register_rt10.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_fork_pr_secret_isolation.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_fuzz_parsers.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_fuzz_soak_regression.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_hashalg.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_hf_entry_verify_eee_digest.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_hf_evals.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_inspect_hook.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_claims_hygiene.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_content_root_migration.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_dsse.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_eval_result.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_examples.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_spec_diff.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_svr.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_jcs_mandatory_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_kbjwt.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_legacy_assurance_deprecation_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_lens_review_fixes_3_1_3.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_load_signer_fd_hazard.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_manifest_lock.json +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_merkle.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_merkle_consistency_property.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_merkle_property.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_mldsa_acvp_vectors.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_mutant_signature_guard.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_mutation_isolation.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_never_raise_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_never_raise_population_guard.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_never_raise_primary_arg_property.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_never_raise_recursion_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_never_raise_surface_family_property.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_official_vectors.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_ok_semantics.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_ots_calendar_hardening.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_ots_external_vectors.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_outcome_receiver_corroboration.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_outcome_verify.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_oversized_int_guard.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_path_argument_type_floor.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_persample.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pinned_key_validation.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_policy_explain_lint.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_policy_lifecycle_purpose.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_policy_profiles.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_policy_templates.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pqsig.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pre_tag_attestation.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pre_tag_audit_provenance.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pre_tag_gate_eigenschaften.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_predicate_type_enforcement.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_prereg.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_promptfoo.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_provenance.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_public_transparency.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pytest_plugin.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_rekor_interop.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_gate_distance_invariance.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_profile.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_property.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_same_key_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_signer_target_340.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_statement.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_statement_rust_parity.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_subject_pin_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_release_integrity_gate.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_renewal.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_renewal_external_token_glue.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_renewal_policy.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_renewal_signed.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_reproducible_build_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_rfc6962_external_vectors.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_roadmap_frontload_foundations.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_root_authenticity.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_run_ledger.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_rust_parity_gate.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_schema.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_schema_parity.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdist_packaging_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdist_selftest_derivation.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_adversarial.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_duplicate_cnf.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_issue.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_reference.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_resource_budget.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_vc.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_verify_binding.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwtvc_external_vectors.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sibling_never_raise_361.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_signature.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_statuslist.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_structural_budget_reachability.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_subject_binding.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_tlogproof.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_tree_context_authenticity.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_trust_pack.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_trust_pack_crypto_agility.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_trust_pack_outcome_receivers_role.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_trust_pack_payloadtype_negatives.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_trust_policy.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_verification_summary.py +0 -0
- {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_verify_matrix.py +0 -0
|
@@ -46,9 +46,10 @@ internal gate (see `REPRODUCTION_RUNBOOK.md`) is a precondition for this review,
|
|
|
46
46
|
|
|
47
47
|
## F. The one remaining gate to stable
|
|
48
48
|
|
|
49
|
-
The single deliberately-open acceptance criterion is "external audit completed".
|
|
50
|
-
pack + the external audit ABSCHLUSS + findings closed/accepted + relation wire-freeze.
|
|
51
|
-
|
|
49
|
+
The single deliberately-open acceptance criterion is "external audit completed". That trustworthy stable
|
|
50
|
+
state = this pack + the external audit ABSCHLUSS + findings closed/accepted + relation wire-freeze. It is
|
|
51
|
+
defined by those facts, not by a version number — the audit is decoupled from the version line and
|
|
52
|
+
carries no version label. Nothing in this repository can flip that bit; only the external reviewer can.
|
|
52
53
|
|
|
53
54
|
## G. Known limitations of the audit-candidate matrix instrument itself (No-Fake, self-declared)
|
|
54
55
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
c9118da583581c150090ddeef9932b8082690a8854320f41a553a3dc60835ed1 AUDITOR_OPEN_POINTS.md
|
|
2
2
|
3d66a85ff79c0258d794e7c8d8740f8a3b7a62e6ffd9bd7dada158a939964660 OPEN_QUESTIONS.md
|
|
3
|
-
|
|
3
|
+
90644ce0e08fdecb8f3076b1b0121b490dbb0ba57e03e9dd700c83d3f785e1a5 PROGRESS.md
|
|
4
4
|
6ccab20c7daef6d71c13e0dcacba24a6a18dd480b5d41418e01b5bf2983ffc9c README.md
|
|
5
5
|
c9ceb3f92a2f720d901affa8defb47004b58a51029317208db641ce53d90b284 REPRODUCTION_RUNBOOK.md
|
|
6
6
|
1b4e4316aaea6c962664fc08945c65a048147fdc4ad89a1e694818b934ef6fa2 calendar_independence.md
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Honest progress accounting (No-Overclaim)
|
|
2
2
|
|
|
3
|
-
The denominator is the full distance from the 3.3.0 baseline (current release:
|
|
4
|
-
trustworthy
|
|
5
|
-
|
|
3
|
+
The denominator is the full distance from the 3.3.0 baseline (current release: 4.0.0) to the externally
|
|
4
|
+
audited, trustworthy state. That state is defined by audit completion and closed findings, not by any
|
|
5
|
+
version number — the audit is decoupled from the version line and happens when maturity is reached,
|
|
6
|
+
whatever version is current then. This is a factual progress statement, not a forward promise, and it is
|
|
7
|
+
deliberately placed in the readiness pack so an auditor reads our own honest number before forming theirs.
|
|
6
8
|
|
|
7
9
|
## Achievable in advance (internal, machine-checkable, no external party): ~85%
|
|
8
10
|
|
|
@@ -21,7 +23,7 @@ placed in the readiness pack so an auditor reads our own honest number before fo
|
|
|
21
23
|
reviewer such as Loek; in-toto maintainer guidance; first outside users). Our side is preparable;
|
|
22
24
|
the other side is not.
|
|
23
25
|
- **~2% irreducible ceiling** (a full TEE-attestation path, whole-program verification, side-channel
|
|
24
|
-
freedom) — deliberately outside
|
|
26
|
+
freedom) — deliberately outside the audit scope, a permanent external/research remainder.
|
|
25
27
|
|
|
26
28
|
## Consequence
|
|
27
29
|
|
{proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/proofbundle/readiness_pack.bundle.json
RENAMED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "proofbundle/v0.1",
|
|
3
|
-
"payload_b64": "
|
|
3
|
+
"payload_b64": "YzkxMThkYTU4MzU4MWMxNTAwOTBkZGVlZjk5MzJiODA4MjY5MGE4ODU0MzIwZjQxYTU1M2EzZGM2MDgzNWVkMSAgQVVESVRPUl9PUEVOX1BPSU5UUy5tZAozZDY2YTg1ZmY3OWMwMjU4ZDc5NGU3YzhkODc0MGY4YTNiN2E2MmU2ZmZkOWJkN2RhZGExNThhOTM5OTY0NjYwICBPUEVOX1FVRVNUSU9OUy5tZAo5MDY0NGNlMGUwOGZkZWNiOGYzMDc2YjFiMDEyMWI0OTBkYmIwYmE1N2UwM2U5ZGQ3MDBjODNkM2Y3ODVlMWE1ICBQUk9HUkVTUy5tZAo2Y2NhYjIwYzdkYWVmNmQ3MWMxM2UwZGNhY2JhMjRhNmExOGRkNDgwYjVkNDE0MThlMDFiNWJmMjk4M2ZmYzljICBSRUFETUUubWQKYzljZWIzZjkyYTJmNzIwZDkwMWFmZmE4ZGVmYjQ3MDA0YjU4YTUxMDI5MzE3MjA4ZGI2NDFjZTUzZDkwYjI4NCAgUkVQUk9EVUNUSU9OX1JVTkJPT0subWQKMWI0ZTQzMTZhYWVhNmM5NjI2NjRmYzA4OTQ1YzY1YTA0ODE0N2ZkYzRhZDg5YTFlNjk0ODE4YjkzNGVmNmZhMiAgY2FsZW5kYXJfaW5kZXBlbmRlbmNlLm1kCjlhOWE5ZTQ5NTYwNzZjNmMyODdkYWRhNWRlODJlYjY2Y2YyNTljZWM4OWE2ZTc5MTA4OGUxNzMzYTc0YzVlYTMgIGRpZmZlcmVudGlhbF9tYXRyaXgubWQKNDI2YTIyYmQ5MWM3YTc1Mjk3MDBjMDY1NzBhM2U1NWZiNGMxMTI4MTk5MmQ2MjE1ZmMyMzE1YjEyNzMxZjljZCAgaW5kZXguanNvbgpkMWQxZTA0ZTlkMmRlMzg0NDNlYzJiOTUzYzNhOWM5NjhhMzAzZTgxOTc3Y2I3ZTEyODQ2ODk0NTE2MGI1NmQ3ICBydXN0X3Bhcml0eV9zY29wZS5tZApmMmE3N2NhY2Q3ZmVmZTM5NDUwZWRiMTg1N2VjMmZmYzI1YTRkNGMzZDhkNjhlZmEwOTRiYTg0YWI3MzI1NzA4ICB0YW1wZXJfcmVzaXN0YW5jZS5tZAo2ZDZhNDA2NWExZTdlMDcxODE5OTYwY2VmOGUwMTE3YWRhOThlOTMxY2Q2MmZkOTQzNDFiNDVhZjQ4NjU3MTFhICB0aHJlYXRfbW9kZWxfZGVsdGFfMzYwLm1kCg==",
|
|
4
4
|
"signature": {
|
|
5
5
|
"alg": "ed25519",
|
|
6
|
-
"public_key_b64": "
|
|
7
|
-
"sig_b64": "
|
|
6
|
+
"public_key_b64": "nw4HE+7lk4peNaNMHeejmVYEANGW9WuR/GernA852JQ=",
|
|
7
|
+
"sig_b64": "HQiW4MHVH14fwTISNergEngB1pQqyQZBSg7O/mhymub0aoqz2Ls/7jKfWtM/piQxiUAd1WxlkgL9UjOwkC2SAQ=="
|
|
8
8
|
},
|
|
9
9
|
"merkle": {
|
|
10
10
|
"hash_alg": "sha256-rfc6962",
|
|
11
11
|
"leaf_index": 0,
|
|
12
12
|
"tree_size": 1,
|
|
13
13
|
"inclusion_proof_b64": [],
|
|
14
|
-
"root_b64": "
|
|
14
|
+
"root_b64": "oan5ljNnHVL4j/dVo1B5EIDeqMxF9w7AZmi7eaazKkk="
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
nw4HE+7lk4peNaNMHeejmVYEANGW9WuR/GernA852JQ=
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "proofbundle"
|
|
7
|
-
version = "
|
|
7
|
+
version = "4.0.0"
|
|
8
8
|
description = "Emit and verify portable cryptographic evidence bundles, offline: Ed25519 + RFC 6962 Merkle + optional SD-JWT."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -45,9 +45,10 @@ _DEFAULT_DOCS = [
|
|
|
45
45
|
"docs/predicates/README.md", "docs/predicates/action-outcome.md", "docs/predicates/decision-receipt.md",
|
|
46
46
|
"docs/predicates/run-ledger.md", "docs/predicates/trust-pack.md", "docs/predicates/verification-summary.md",
|
|
47
47
|
"docs/SDJWT_VC_PROFILE.md", "docs/SUBJECT_BINDING.md",
|
|
48
|
-
#
|
|
49
|
-
# PROGRESS.md is deliberately NOT here: it QUOTES the future goal "
|
|
50
|
-
# as an honest denominator
|
|
48
|
+
# Audit-candidate readiness-pack reviewer docs (capability-claim genre, same discipline).
|
|
49
|
+
# PROGRESS.md is deliberately NOT here: it QUOTES the future goal "the externally audited, trustworthy
|
|
50
|
+
# state" as an honest denominator (version-free — the audit is decoupled from the version line, Owner
|
|
51
|
+
# 2026-08-17), which the audit-candidate forbidden list would false-positive on.
|
|
51
52
|
"docs/readiness_pack/AUDITOR_OPEN_POINTS.md", "docs/readiness_pack/threat_model_delta_360.md",
|
|
52
53
|
"docs/readiness_pack/rust_parity_scope.md", "docs/readiness_pack/differential_matrix.md",
|
|
53
54
|
"docs/readiness_pack/REPRODUCTION_RUNBOOK.md",
|
|
@@ -13,7 +13,7 @@ from __future__ import annotations
|
|
|
13
13
|
|
|
14
14
|
from typing import TYPE_CHECKING
|
|
15
15
|
|
|
16
|
-
__version__ = "
|
|
16
|
+
__version__ = "4.0.0"
|
|
17
17
|
|
|
18
18
|
# The `proofbundle/v0.1` normative spec revision this build implements — kept in sync with the
|
|
19
19
|
# `Revision:` line at the top of SPEC.md by tests/test_docs_truth.py (WP-B1, closes #28). Bump
|
|
@@ -156,7 +156,14 @@ def verify_rootcommit_v1(checkpoint_text: str, *, frozen: Optional[dict] = None,
|
|
|
156
156
|
return {"known_anchors": known, "binding": False, "reject": True, "status": "bad_opaque",
|
|
157
157
|
"detail": "rootcommit/v1 opaque is not 0x01 || wlen || wallet || ots"}
|
|
158
158
|
wallet, ots = parsed
|
|
159
|
-
|
|
159
|
+
# DEEP-GATE re-gate F-8 neighbour: build_preimage encodes attacker-controlled checkpoint fields to
|
|
160
|
+
# UTF-8; a lone-surrogate origin/wallet would raise a raw UnicodeEncodeError out of this "never a raw
|
|
161
|
+
# exception" surface (docstring on _iter helper). Fail closed to the same malformed verdict instead.
|
|
162
|
+
try:
|
|
163
|
+
commitment = hashlib.sha256(build_preimage(origin, size, root, wallet)).digest()
|
|
164
|
+
except (UnicodeError, ValueError, TypeError):
|
|
165
|
+
return {"known_anchors": known, "binding": False, "reject": True, "status": "malformed_checkpoint",
|
|
166
|
+
"detail": "checkpoint field is not UTF-8 encodable (surrogate/non-encodable), fail-closed"}
|
|
160
167
|
b = _binding_status(ots, commitment, frozen=frozen, rp_trust=rp_trust)
|
|
161
168
|
bound = b["status"] not in ("unbound", "malformed", "no_lib")
|
|
162
169
|
return {"known_anchors": known, "binding": bound, "reject": not bound,
|
|
@@ -250,7 +257,13 @@ def verify_rootcommit_v2sig(checkpoint_text: str, *, frozen: Optional[dict] = No
|
|
|
250
257
|
if parsed is None:
|
|
251
258
|
return {"known_anchors": known, "binding": False, "sig_ok": None, "reject": True, "status": "bad_opaque"}
|
|
252
259
|
wallet, sig, ots = parsed
|
|
253
|
-
|
|
260
|
+
# DEEP-GATE re-gate F-8 neighbour (as in verify_rootcommit_v1): fail closed on a non-encodable field.
|
|
261
|
+
try:
|
|
262
|
+
commitment = hashlib.sha256(build_preimage(origin, size, root, wallet, tag=TAG_V1)).digest()
|
|
263
|
+
except (UnicodeError, ValueError, TypeError):
|
|
264
|
+
return {"known_anchors": known, "binding": False, "sig_ok": None, "reject": True,
|
|
265
|
+
"status": "malformed_checkpoint",
|
|
266
|
+
"detail": "checkpoint field is not UTF-8 encodable (surrogate/non-encodable), fail-closed"}
|
|
254
267
|
b = _binding_status(ots, commitment, frozen=frozen, rp_trust=rp_trust)
|
|
255
268
|
bound = b["status"] not in ("unbound", "malformed", "no_lib")
|
|
256
269
|
# signature: EIP-191 recover over (tag + '\n' + commitment_hex) must equal the bound wallet (dep-gated)
|
|
@@ -49,20 +49,66 @@ def _root_std_b64(root: bytes) -> str:
|
|
|
49
49
|
return base64.b64encode(root).decode("ascii")
|
|
50
50
|
|
|
51
51
|
|
|
52
|
+
def _origin_wellformed(origin: str) -> bool:
|
|
53
|
+
"""An origin / note identity safe for the EXACT origin-quorum compare: printable ASCII only, no '+'
|
|
54
|
+
(the vkey separator), no leading/trailing space and no double space. A single internal ASCII space
|
|
55
|
+
is allowed so Go sumdb's `go.sum database tree` verifies; a witness NAME carries no space at all
|
|
56
|
+
(enforced), so a spaced origin still cannot equal one.
|
|
57
|
+
|
|
58
|
+
Printable-ASCII is the POSITIVE, non-enumerated rule that closes the whole invisible/look-alike
|
|
59
|
+
CLASS at once, instead of chasing one Unicode category per round (Deep-Gate F-1 zero-width → re-gate
|
|
60
|
+
NBSP → re-gate variation-selectors/Default-Ignorable/appended-space). None of those can cloak an
|
|
61
|
+
origin into looking like a witness name it then escapes the exclusion under, because none is
|
|
62
|
+
printable ASCII: a zero-width (Cf), a Default_Ignorable letter (Hangul filler, category Lo), a
|
|
63
|
+
variation selector or combining mark (Mn), a NBSP or other non-plain whitespace (Zs), a control char
|
|
64
|
+
(Cc) — all rejected. Measured against every shipped external vector (Go sumdb, Rekor, rootcommit,
|
|
65
|
+
Colin's fixtures): all pass. Honest scope: this also refuses a non-ASCII (IDN/Unicode) origin, a
|
|
66
|
+
deliberate restriction for the verifier's identity compare; no real tlog origin is non-ASCII."""
|
|
67
|
+
# DEEP-GATE 4.0.0 re-gate iter5 (never-raise, caller-contract): a non-str origin (None/int/list from a
|
|
68
|
+
# caller that built it from an upstream JSON field) reached `.isascii()` and raised a raw AttributeError
|
|
69
|
+
# out of every public constructor/cosign surface that routes identity through this helper. Same
|
|
70
|
+
# isinstance(str) guard the parse helpers already carry — validate the TYPE before the content.
|
|
71
|
+
if not isinstance(origin, str):
|
|
72
|
+
return False
|
|
73
|
+
if not origin or "+" in origin:
|
|
74
|
+
return False
|
|
75
|
+
if not (origin.isascii() and origin.isprintable()):
|
|
76
|
+
return False
|
|
77
|
+
return origin == origin.strip() and " " not in origin
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _witness_name_wellformed(name: str) -> bool:
|
|
81
|
+
"""A witness NAME safe for the exact compare: non-empty printable ASCII, no '+', no space at all
|
|
82
|
+
(a schemeless identity). Stricter than an origin, which allows internal spaces — the emit path
|
|
83
|
+
(cosign_checkpoint / _mldsa) always required this; :func:`_parse_witness_vkey` now enforces it on
|
|
84
|
+
the verify path too, so a name cloaked with any whitespace or invisible character cannot parse."""
|
|
85
|
+
return (isinstance(name, str) and bool(name) and "+" not in name and " " not in name
|
|
86
|
+
and name.isascii() and name.isprintable())
|
|
87
|
+
|
|
88
|
+
|
|
52
89
|
def checkpoint_note(origin: str, tree_size: int, root: bytes) -> str:
|
|
53
90
|
"""Build the C2SP checkpoint note text (3 lines + trailing newline). ``root`` is the raw RFC 6962
|
|
54
91
|
Merkle root bytes at ``tree_size``. ``origin`` must be non-empty with no spaces/'+' (a schemeless URL)."""
|
|
55
|
-
if not
|
|
56
|
-
raise BundleFormatError("checkpoint origin must be a
|
|
92
|
+
if not _origin_wellformed(origin):
|
|
93
|
+
raise BundleFormatError("checkpoint origin must be a printable-ASCII schemeless id without "
|
|
94
|
+
"edge/double spaces, invisible characters, or '+'")
|
|
57
95
|
if isinstance(tree_size, bool) or not isinstance(tree_size, int) or tree_size < 0:
|
|
58
96
|
raise BundleFormatError("checkpoint tree_size must be a non-negative integer")
|
|
97
|
+
if not isinstance(root, bytes): # iter5 never-raise: a non-bytes root raised raw TypeError from b64encode
|
|
98
|
+
raise BundleFormatError("checkpoint root must be raw bytes")
|
|
59
99
|
return f"{origin}\n{tree_size}\n{_root_std_b64(root)}\n"
|
|
60
100
|
|
|
61
101
|
|
|
62
102
|
def key_id(keyname: str, pubkey: bytes) -> bytes:
|
|
63
103
|
"""C2SP note key ID = first 4 bytes of SHA-256(keyname ‖ 0x0A ‖ 0x01 ‖ 32-byte-Ed25519-pubkey)."""
|
|
64
|
-
if len(pubkey) != 32:
|
|
104
|
+
if not isinstance(pubkey, bytes) or len(pubkey) != 32:
|
|
65
105
|
raise BundleFormatError("Ed25519 public key must be 32 raw bytes")
|
|
106
|
+
# DEEP-GATE re-gate F-8/F-10: the log key name is the third identity slot (with origin and witness
|
|
107
|
+
# name); it is encoded into the keyID, so a surrogate name would raise a raw UnicodeEncodeError
|
|
108
|
+
# out of this public helper, and a zero-width/invisible name would substitute for a real one.
|
|
109
|
+
# Same printable-ASCII rule as origin/witness name — closed at the source that does the encode.
|
|
110
|
+
if not _witness_name_wellformed(keyname):
|
|
111
|
+
raise BundleFormatError("key name must be a printable-ASCII identity without spaces or invisible characters")
|
|
66
112
|
h = hashlib.sha256(keyname.encode("utf-8") + b"\n" + bytes([_ED25519_SIG_TYPE]) + pubkey).digest()
|
|
67
113
|
return h[:4]
|
|
68
114
|
|
|
@@ -79,8 +125,9 @@ def sign_checkpoint(origin: str, tree_size: int, root: bytes, signer, keyname: s
|
|
|
79
125
|
"""Produce a signed C2SP checkpoint note. ``signer`` is an Ed25519 private key whose public key must
|
|
80
126
|
correspond to ``keyname``. The signature is over the RAW note-text bytes (including the trailing
|
|
81
127
|
newline), never over base64 and never PAE-wrapped."""
|
|
82
|
-
if not
|
|
83
|
-
raise BundleFormatError("checkpoint keyname must be
|
|
128
|
+
if not _witness_name_wellformed(keyname):
|
|
129
|
+
raise BundleFormatError("checkpoint keyname must be a printable-ASCII identity "
|
|
130
|
+
"without spaces, invisible characters, or '+'")
|
|
84
131
|
note = checkpoint_note(origin, tree_size, root)
|
|
85
132
|
pubkey = signer.public_key().public_bytes(Encoding.Raw, PublicFormat.Raw)
|
|
86
133
|
sig = signer.sign(note.encode("utf-8"))
|
|
@@ -103,6 +150,10 @@ def _parse_vkey(vkey_str: str, sig_type: int = _ED25519_SIG_TYPE) -> tuple[str,
|
|
|
103
150
|
if len(parts) != 3:
|
|
104
151
|
raise BundleFormatError("vkey must have 3 '+'-separated parts (name+hexKeyID+base64KeyMaterial)")
|
|
105
152
|
name, kid_hex, keymat_b64 = parts
|
|
153
|
+
# DEEP-GATE re-gate F-8: the log vkey NAME is encoded into key_id below; a surrogate name would
|
|
154
|
+
# raise UnicodeEncodeError and an invisible one would substitute — same rule as the witness vkey.
|
|
155
|
+
if not _witness_name_wellformed(name):
|
|
156
|
+
raise BundleFormatError("vkey name must be a printable-ASCII identity without spaces or invisible characters")
|
|
106
157
|
try:
|
|
107
158
|
keymat = base64.b64decode(keymat_b64, validate=True)
|
|
108
159
|
except (ValueError, TypeError) as exc:
|
|
@@ -145,17 +196,33 @@ def verify_checkpoint(signed_note: str, vkey_str: str) -> dict:
|
|
|
145
196
|
raise BundleFormatError("signed note has no empty-line separator between text and signatures")
|
|
146
197
|
note_text, sig_block = signed_note.split("\n\n", 1)
|
|
147
198
|
note_text += "\n" # restore the trailing newline that belongs to the note text
|
|
148
|
-
note_bytes = note_text.encode("utf-8")
|
|
149
199
|
lines = note_text.split("\n")
|
|
150
200
|
if len(lines) < 4 or not lines[0] or not lines[1] or not lines[2]:
|
|
151
201
|
raise BundleFormatError("checkpoint note must have at least 3 non-empty lines")
|
|
152
202
|
origin, size_s, root_b64 = lines[0], lines[1], lines[2]
|
|
203
|
+
# DEEP-GATE F-1 + re-gate (2026-08-17): the origin must be a printable-ASCII identity with no
|
|
204
|
+
# edge/double space, so it cannot cloak a witness name it would then escape the origin-quorum
|
|
205
|
+
# exclusion under (via zero-width, Default-Ignorable, variation selector, NBSP or an appended
|
|
206
|
+
# space). Positive rule = the whole class, not one category per round. Go sumdb / Rekor stay valid.
|
|
207
|
+
if not _origin_wellformed(origin):
|
|
208
|
+
raise BundleFormatError("checkpoint origin must be a printable-ASCII identity without "
|
|
209
|
+
"edge/double spaces, invisible characters, or '+' (malformed)")
|
|
153
210
|
if len(size_s) > 20 or (size_s != "0" and (size_s.startswith("0") or not (size_s.isascii() and size_s.isdigit()))):
|
|
154
211
|
raise BundleFormatError("checkpoint tree size must be ASCII decimal with no leading zeros")
|
|
155
212
|
try:
|
|
156
213
|
root = base64.b64decode(root_b64, validate=True)
|
|
157
214
|
except (ValueError, TypeError) as exc:
|
|
158
215
|
raise BundleFormatError("checkpoint root is not valid standard base64") from exc
|
|
216
|
+
# DEEP-GATE 4.0.0 re-gate (D2/D3): the note-text encode was ABOVE this block, so a lone/unpaired
|
|
217
|
+
# UTF-16 surrogate anywhere in the note (a str survives splitting but is not valid UTF-8) raised a
|
|
218
|
+
# raw UnicodeEncodeError out of verify_witnessed_checkpoint / evaluate_public_transparency — the one
|
|
219
|
+
# verify_checkpoint instance the F-8/F-10 validate-before-encode re-gates missed (verify_tlog_proof
|
|
220
|
+
# already wraps its call; the sibling _note_text_of already validates first). Encode AFTER the string
|
|
221
|
+
# validation, and fail-closed on any residual non-UTF-8 note text (e.g. a surrogate in an extension line).
|
|
222
|
+
try:
|
|
223
|
+
note_bytes = note_text.encode("utf-8")
|
|
224
|
+
except UnicodeEncodeError as exc:
|
|
225
|
+
raise BundleFormatError("checkpoint note text is not valid UTF-8 (malformed, fail-closed)") from exc
|
|
159
226
|
|
|
160
227
|
ok = False
|
|
161
228
|
# WAR DER SCHLUESSEL UEBERHAUPT DABEI? Diese Unterscheidung entsteht in der Schleife unten und
|
|
@@ -228,8 +295,14 @@ def root_bytes_from_b64(root_b64: str) -> Optional[bytes]:
|
|
|
228
295
|
|
|
229
296
|
def cosign_key_id(witness_name: str, pubkey: bytes) -> bytes:
|
|
230
297
|
"""Cosignature/v1 key ID = SHA-256(name ‖ 0x0A ‖ 0x04 ‖ 32-byte-Ed25519-pubkey)[:4]."""
|
|
231
|
-
if len(pubkey) != 32:
|
|
298
|
+
if not isinstance(pubkey, bytes) or len(pubkey) != 32:
|
|
232
299
|
raise BundleFormatError("Ed25519 public key must be 32 raw bytes")
|
|
300
|
+
# DEEP-GATE re-gate F-8/F-10: the witness name is the third identity slot (with origin and witness
|
|
301
|
+
# name); it is encoded into the keyID, so a surrogate name would raise a raw UnicodeEncodeError
|
|
302
|
+
# out of this public helper, and a zero-width/invisible name would substitute for a real one.
|
|
303
|
+
# Same printable-ASCII rule as origin/witness name — closed at the source that does the encode.
|
|
304
|
+
if not _witness_name_wellformed(witness_name):
|
|
305
|
+
raise BundleFormatError("witness name must be a printable-ASCII identity without spaces or invisible characters")
|
|
233
306
|
h = hashlib.sha256(witness_name.encode("utf-8") + b"\n"
|
|
234
307
|
+ bytes([_COSIG_V1_SIG_TYPE]) + pubkey).digest()
|
|
235
308
|
return h[:4]
|
|
@@ -255,6 +328,37 @@ def _note_text_of(signed_note: str) -> str:
|
|
|
255
328
|
lines = note_text.split("\n")
|
|
256
329
|
if len(lines) < 4 or not lines[0] or not lines[1] or not lines[2]:
|
|
257
330
|
raise BundleFormatError("checkpoint note must have at least 3 non-empty lines")
|
|
331
|
+
# DEEP-GATE F-1 + re-gate: reject a cloaked origin here too, so every consumer of the note body
|
|
332
|
+
# (verify_cosignature, witness_quorum's origin extraction) sees an exact-comparable identity.
|
|
333
|
+
if not _origin_wellformed(lines[0]):
|
|
334
|
+
raise BundleFormatError("checkpoint origin must be a printable-ASCII identity without "
|
|
335
|
+
"edge/double spaces, invisible characters, or '+' (malformed)")
|
|
336
|
+
# DEEP-GATE 4.0.0 re-gate (D2/D3 CLASS fix): _origin_wellformed only checks lines[0]. The note body
|
|
337
|
+
# ALSO carries size, root and OPTIONAL C2SP extension lines (lines[3:]) that _cosigned_message encodes
|
|
338
|
+
# WHOLE — a lone/unpaired UTF-16 surrogate anywhere in it raised a raw UnicodeEncodeError out of the
|
|
339
|
+
# public verify_cosignature / evaluate_public_transparency / cosign_checkpoint surfaces. verify_checkpoint
|
|
340
|
+
# fixed the ordering for its OWN copy of the text; this shared cosignature-path parser is the neighbour
|
|
341
|
+
# instance the first cut missed. Validate the whole note body is UTF-8-safe here, once, for every consumer.
|
|
342
|
+
try:
|
|
343
|
+
note_text.encode("utf-8")
|
|
344
|
+
except UnicodeEncodeError as exc:
|
|
345
|
+
raise BundleFormatError("checkpoint note text is not valid UTF-8 (malformed, fail-closed)") from exc
|
|
346
|
+
# DEEP-GATE 4.0.0 re-gate iter4 (D2/D3 CLASS, third neighbour, found by a 4th adversarial pass):
|
|
347
|
+
# _note_text_of guaranteed only origin + UTF-8, NOT that line 1 is a uint64 decimal or line 2 valid
|
|
348
|
+
# base64. cosign_checkpoint_mldsa is the one consumer that does not RE-validate them (verify_checkpoint
|
|
349
|
+
# and verify_cosignature each do their own) — it fed the raw lines into int(size_s).to_bytes(8,"big") and
|
|
350
|
+
# base64.b64decode(validate=True), raising a raw ValueError / binascii.Error / OverflowError (incl. the
|
|
351
|
+
# CVE-2020-10735 integer-string DoS on a 5000-digit size) out of a public witness-signing surface.
|
|
352
|
+
# Validate the note-body fields here, once, for every consumer of the shared parser. The len<=20 test
|
|
353
|
+
# short-circuits before int(size_s), so an over-long digit string never reaches the (bounded) int parse.
|
|
354
|
+
size_s, root_b64 = lines[1], lines[2]
|
|
355
|
+
if len(size_s) > 20 or not (size_s.isascii() and size_s.isdigit()) \
|
|
356
|
+
or (size_s != "0" and size_s.startswith("0")) or int(size_s) >= 2 ** 64:
|
|
357
|
+
raise BundleFormatError("checkpoint tree size must be a uint64 ASCII decimal with no leading zeros")
|
|
358
|
+
try:
|
|
359
|
+
base64.b64decode(root_b64, validate=True)
|
|
360
|
+
except (ValueError, TypeError) as exc:
|
|
361
|
+
raise BundleFormatError("checkpoint root is not valid standard base64") from exc
|
|
258
362
|
return note_text
|
|
259
363
|
|
|
260
364
|
|
|
@@ -275,8 +379,9 @@ def cosign_checkpoint(signed_note: str, witness_signer, witness_name: str, times
|
|
|
275
379
|
if isinstance(timestamp, bool) or not isinstance(timestamp, int) \
|
|
276
380
|
or not 0 <= timestamp <= _MAX_COSIG_TIMESTAMP:
|
|
277
381
|
raise BundleFormatError("cosignature timestamp must be an integer in [0, 2^63-1]")
|
|
278
|
-
if not
|
|
279
|
-
raise BundleFormatError("witness name must be
|
|
382
|
+
if not _witness_name_wellformed(witness_name):
|
|
383
|
+
raise BundleFormatError("witness name must be a printable-ASCII identity "
|
|
384
|
+
"without spaces, invisible characters, or '+'")
|
|
280
385
|
note_text = _note_text_of(signed_note)
|
|
281
386
|
if not signed_note.endswith("\n"):
|
|
282
387
|
raise BundleFormatError("signed note must end with a newline")
|
|
@@ -289,8 +394,14 @@ def cosign_checkpoint(signed_note: str, witness_signer, witness_name: str, times
|
|
|
289
394
|
|
|
290
395
|
def cosign_key_id_mldsa(witness_name: str, pubkey: bytes) -> bytes:
|
|
291
396
|
"""ML-DSA-44 cosignature key ID = SHA-256(name ‖ 0x0A ‖ 0x06 ‖ 1312-byte pubkey)[:4]."""
|
|
292
|
-
if len(pubkey) != _MLDSA44_PUB_LEN:
|
|
397
|
+
if not isinstance(pubkey, bytes) or len(pubkey) != _MLDSA44_PUB_LEN:
|
|
293
398
|
raise BundleFormatError("ML-DSA-44 public key must be 1312 raw bytes")
|
|
399
|
+
# DEEP-GATE re-gate F-8/F-10: the witness name is the third identity slot (with origin and witness
|
|
400
|
+
# name); it is encoded into the keyID, so a surrogate name would raise a raw UnicodeEncodeError
|
|
401
|
+
# out of this public helper, and a zero-width/invisible name would substitute for a real one.
|
|
402
|
+
# Same printable-ASCII rule as origin/witness name — closed at the source that does the encode.
|
|
403
|
+
if not _witness_name_wellformed(witness_name):
|
|
404
|
+
raise BundleFormatError("witness name must be a printable-ASCII identity without spaces or invisible characters")
|
|
294
405
|
h = hashlib.sha256(witness_name.encode("utf-8") + b"\n"
|
|
295
406
|
+ bytes([_COSIG_MLDSA_SIG_TYPE]) + pubkey).digest()
|
|
296
407
|
return h[:4]
|
|
@@ -351,8 +462,9 @@ def cosign_checkpoint_mldsa(signed_note: str, witness_signer, witness_name: str,
|
|
|
351
462
|
if isinstance(timestamp, bool) or not isinstance(timestamp, int) \
|
|
352
463
|
or not 0 <= timestamp <= _MAX_COSIG_TIMESTAMP:
|
|
353
464
|
raise BundleFormatError("cosignature timestamp must be an integer in [0, 2^63-1]")
|
|
354
|
-
if not
|
|
355
|
-
raise BundleFormatError("witness name must be
|
|
465
|
+
if not _witness_name_wellformed(witness_name):
|
|
466
|
+
raise BundleFormatError("witness name must be a printable-ASCII identity "
|
|
467
|
+
"without spaces, invisible characters, or '+'")
|
|
356
468
|
note_text = _note_text_of(signed_note)
|
|
357
469
|
if not signed_note.endswith("\n"):
|
|
358
470
|
raise BundleFormatError("signed note must end with a newline")
|
|
@@ -379,6 +491,14 @@ def _parse_witness_vkey(vkey_str: str) -> tuple[str, bytes, bytes, int]:
|
|
|
379
491
|
if len(parts) != 3:
|
|
380
492
|
raise BundleFormatError("vkey must have 3 '+'-separated parts (name+hexKeyID+base64KeyMaterial)")
|
|
381
493
|
name, kid_hex, keymat_b64 = parts
|
|
494
|
+
# DEEP-GATE re-gate (2026-08-17): a witness NAME must be a printable-ASCII identity with no
|
|
495
|
+
# space (the emit path always required this; enforced on the VERIFY path here too). A name
|
|
496
|
+
# cloaked with whitespace, a zero-width, a variation selector or a Default-Ignorable character
|
|
497
|
+
# would parse and verify, look identical to the origin, yet be byte-different, so the
|
|
498
|
+
# origin-quorum name compare would miss it and the log would vote under a cloaked name.
|
|
499
|
+
if not _witness_name_wellformed(name):
|
|
500
|
+
raise BundleFormatError(
|
|
501
|
+
"witness vkey name must be a printable-ASCII identity without spaces or invisible characters")
|
|
382
502
|
try:
|
|
383
503
|
keymat = base64.b64decode(keymat_b64, validate=True)
|
|
384
504
|
except (ValueError, TypeError) as exc:
|
|
@@ -487,7 +607,25 @@ def _witness_key_material(vkey: str) -> bytes:
|
|
|
487
607
|
return base64.b64decode(vkey.split("+", 2)[2])
|
|
488
608
|
|
|
489
609
|
|
|
490
|
-
def
|
|
610
|
+
def _log_key_material_of(log_vkey: str) -> "bytes | None":
|
|
611
|
+
"""The raw public-key bytes of a LOG vkey (0x01), for the origin-quorum key-material exclusion
|
|
612
|
+
(DEEP-GATE F-2). Compared against a witness vkey's pubkey bytes WITHOUT the alg-type prefix, so a
|
|
613
|
+
log that reuses its 0x01 signing key as a 0x04 cosignature key is caught despite the differing
|
|
614
|
+
prefix. Defensive: a malformed log vkey yields None (the exclusion then falls back to the name
|
|
615
|
+
test), never a raise — on the real path verify_checkpoint already raised on a malformed log vkey."""
|
|
616
|
+
try:
|
|
617
|
+
_name, _kid, pubkey = _parse_vkey(log_vkey)
|
|
618
|
+
return pubkey
|
|
619
|
+
except (BundleFormatError, ValueError, TypeError):
|
|
620
|
+
# DEEP-GATE re-gate F-7: catch the BASE families, not just BundleFormatError — a lone-surrogate
|
|
621
|
+
# log-vkey name reaches key_id -> name.encode("utf-8") and raises UnicodeEncodeError (a
|
|
622
|
+
# ValueError), which would otherwise escape this "never a raise" helper and, through the new
|
|
623
|
+
# public_transparency call site, become a raw traceback out of a documented fail-closed surface.
|
|
624
|
+
return None
|
|
625
|
+
|
|
626
|
+
|
|
627
|
+
def witness_quorum(signed_note: str, witness_vkeys, threshold: int, *,
|
|
628
|
+
log_key_material: "bytes | None"): # DEEP-GATE 4.0.0 D1: REQUIRED keyword (was `= None`)
|
|
491
629
|
"""Shared k-of-n witness quorum (release-review fix): counts DISTINCT witness KEY MATERIAL, not names —
|
|
492
630
|
C2SP requires operators to use distinct keys per cosigner, so one physical key under N names is ONE witness.
|
|
493
631
|
Alg-agnostic (Ed25519 0x04 + ML-DSA 0x06). Used by BOTH verify_witnessed_checkpoint AND tlogproof.
|
|
@@ -495,26 +633,85 @@ def witness_quorum(signed_note: str, witness_vkeys, threshold: int):
|
|
|
495
633
|
(witnesses_ok, witnesses_dict); the dict is keyed by name+keyID so a same-name-different-key entry does not
|
|
496
634
|
overwrite. Fail-closed: an unparseable witness vkey raises (verify_cosignature); a non-verifying one is
|
|
497
635
|
False; and a witness whose algorithm this build cannot verify (an ML-DSA vkey without the [pq] extra) also
|
|
498
|
-
counts as non-verifying (False), never a raw UnsupportedError out of the batch (adversarial re-audit round 5).
|
|
636
|
+
counts as non-verifying (False), never a raw UnsupportedError out of the batch (adversarial re-audit round 5).
|
|
637
|
+
|
|
638
|
+
ORIGIN-QUORUM RULE — a log never votes in its own quorum. A witness cosignature is EXCLUDED from
|
|
639
|
+
the count (``ok=False``, ``origin_excluded=True``, before any signature math) when EITHER holds:
|
|
640
|
+
|
|
641
|
+
* its **key material** equals ``log_key_material`` (the audited log's own signing-key public
|
|
642
|
+
bytes, passed by the caller that knows which log it verifies) — the ROBUST test, algorithm-
|
|
643
|
+
agnostic and independent of the name the line claims; or
|
|
644
|
+
* its **name** equals the note's own origin line — the exact-codepoint name test.
|
|
645
|
+
|
|
646
|
+
Why BOTH, and why the name test alone is not enough (Deep-Gate re-gate 2026-08-17, F-1/F-2):
|
|
647
|
+
the Ed25519 cosignature/v1 signed message does NOT commit to the cosigner name (unlike ML-DSA-44,
|
|
648
|
+
which does), so a line CAN be relabelled under any name without the private key — a name-only rule
|
|
649
|
+
is bypassable for Ed25519, and a zero-width character in the origin line defeats the exact name
|
|
650
|
+
compare outright (closed separately by :func:`_origin_wellformed`). Keying the exclusion on the
|
|
651
|
+
LOG's public bytes uses an operand the log/attacker does not get to choose. HONEST LIMITS that
|
|
652
|
+
remain and are documented at the call sites:
|
|
653
|
+
* a log cosigning with a SEPARATE key (not its signing key) under a non-origin alias that a
|
|
654
|
+
relying party wrongly lists as an independent witness — roster provenance, a deployment
|
|
655
|
+
property no local rule can catch;
|
|
656
|
+
* the name compare is EXACT bytes (no normalisation), so BYTE-DIFFERENT FORMS OF THE SAME
|
|
657
|
+
IDENTITY are not caught by the name prong: an ASCII case variant (`LOG.example.com`, DNS is
|
|
658
|
+
case-insensitive), an FQDN trailing dot (`log.example.com.`), or a path-normalisation form
|
|
659
|
+
(`log.example.com//x`). These are the same owner, not a look-alike; the robust defences for
|
|
660
|
+
them are the key-material prong (when the log reuses its signing key) and `expected_origin`
|
|
661
|
+
(the relying-party pin). Exactness is kept deliberately — the opposite (normalising the
|
|
662
|
+
compare) would loosen `expected_origin` acceptance, whose safe direction is the reverse.
|
|
663
|
+
``log_key_material=None`` (a direct call with no log context) applies only the name test; the
|
|
664
|
+
public surfaces always pass it (and `public_transparency` fails closed if a supplied log_vkey is
|
|
665
|
+
unusable, rather than silently dropping the key-material prong)."""
|
|
499
666
|
keys_ok = set()
|
|
500
667
|
witnesses = {}
|
|
668
|
+
if isinstance(threshold, bool) or not isinstance(threshold, int) or threshold < 0: # iter5 never-raise (defensive)
|
|
669
|
+
raise BundleFormatError("witness quorum threshold must be a non-negative integer")
|
|
501
670
|
# adversarial re-audit round 4: guard the SHARED SINK, not just one caller — verify_witnessed_checkpoint AND
|
|
502
671
|
# public_transparency.evaluate_public_transparency both funnel witness_vkeys into this loop; a non-iterable
|
|
503
672
|
# (int/bool/object) or a str (per-char iteration) crashed it raw. Fail-closed empty quorum, never a raise.
|
|
504
673
|
if isinstance(witness_vkeys, (str, bytes, bytearray)) or not hasattr(witness_vkeys, "__iter__"):
|
|
505
674
|
return False, {}
|
|
675
|
+
# The origin is parsed LAZILY and defensively: a malformed note must keep its existing contract
|
|
676
|
+
# (an empty roster returns without raising; a non-empty one raises in verify_cosignature below),
|
|
677
|
+
# so a parse failure here downgrades to origin=None instead of introducing a new raise path.
|
|
678
|
+
# origin=None never equals a str vkey name, and on such a note nothing verifies anyway.
|
|
679
|
+
try:
|
|
680
|
+
origin = _note_text_of(signed_note).split("\n", 1)[0]
|
|
681
|
+
except BundleFormatError:
|
|
682
|
+
origin = None
|
|
506
683
|
for wv in witness_vkeys:
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
684
|
+
res = None
|
|
685
|
+
if isinstance(wv, str):
|
|
686
|
+
name_hit = origin is not None and wv.split("+", 2)[0] == origin
|
|
687
|
+
if name_hit or log_key_material is not None:
|
|
688
|
+
# Parse to compare key material AND to learn the alg for the report entry. This keeps the
|
|
689
|
+
# documented raise contract: an unparseable vkey raises here (same typed BundleFormatError
|
|
690
|
+
# verify_cosignature would raise one line down), and a 0x01 log key is rejected AS a witness
|
|
691
|
+
# (domain separation) exactly as everywhere else.
|
|
692
|
+
_name, _kid, wv_pk, sig_type = _parse_witness_vkey(wv)
|
|
693
|
+
material_hit = log_key_material is not None and wv_pk == log_key_material
|
|
694
|
+
if name_hit or material_hit:
|
|
695
|
+
reason = ("its name equals the checked log's own origin" if name_hit
|
|
696
|
+
else "its key material equals the audited log's own signing key")
|
|
697
|
+
res = {"ok": False,
|
|
698
|
+
"alg": "ed25519-cosignature/v1" if sig_type == _COSIG_V1_SIG_TYPE else "ml-dsa-44",
|
|
699
|
+
"origin": origin, "tree_size": None, "root": None, "timestamp": None,
|
|
700
|
+
"origin_excluded": True,
|
|
701
|
+
"detail": f"witness excluded — {reason}; a log never counts toward its own "
|
|
702
|
+
"witness quorum (origin-quorum rule, fail-closed)"}
|
|
703
|
+
if res is None:
|
|
704
|
+
try:
|
|
705
|
+
res = verify_cosignature(signed_note, wv)
|
|
706
|
+
except UnsupportedError as exc:
|
|
707
|
+
# adversarial re-audit round 5: a BATCH quorum must not crash because ONE witness in the list is an
|
|
708
|
+
# ML-DSA (0x06) vkey the current build cannot verify (no FIPS-204). verify_cosignature keeps its
|
|
709
|
+
# documented loud raise for a SINGLE explicitly-named witness (a caller config choice, tested), but
|
|
710
|
+
# here — iterating an attacker-influenceable list — an un-verifiable witness counts as non-verifying
|
|
711
|
+
# (fail-closed False), never a raw UnsupportedError out of witness_quorum / verify_witnessed_checkpoint.
|
|
712
|
+
res = {"ok": False, "alg": "ml-dsa-44", "origin": None, "tree_size": None,
|
|
713
|
+
"root": None, "timestamp": None,
|
|
714
|
+
"detail": f"witness needs the [pq] extra (FIPS 204) — cannot verify, fail-closed ({exc})"}
|
|
518
715
|
witnesses["+".join(wv.split("+")[:2])] = res
|
|
519
716
|
if res["ok"]:
|
|
520
717
|
keys_ok.add(_witness_key_material(wv))
|
|
@@ -532,6 +729,9 @@ def verify_witnessed_checkpoint(signed_note: str, log_vkey: str, witness_vkeys,
|
|
|
532
729
|
result.
|
|
533
730
|
Fail-closed: an unparseable witness vkey raises; a non-verifying one counts as False; an ML-DSA witness
|
|
534
731
|
this build cannot verify (no [pq] extra) counts as non-verifying, not a raise (adversarial re-audit round 5).
|
|
732
|
+
Origin-quorum rule (see :func:`witness_quorum`): a cosignature made with the LOG's own signing key,
|
|
733
|
+
or one whose name equals the origin line, never counts — this surface passes ``log_key_material`` so
|
|
734
|
+
the robust key-material test applies, not the name test alone.
|
|
535
735
|
|
|
536
736
|
``expected_origin`` (3.8.0) is the origin binding this surface was missing. A checkpoint carries
|
|
537
737
|
the identity of the log that issued it, and a signature proves that SOME log signed — not WHICH
|
|
@@ -563,7 +763,10 @@ def verify_witnessed_checkpoint(signed_note: str, log_vkey: str, witness_vkeys,
|
|
|
563
763
|
# GESTELLTE Frage, die immer fehlschlaegt, keine abwesende.
|
|
564
764
|
log_ok = bool(log_res["ok"]) and (expected_origin is None
|
|
565
765
|
or log_res["origin"] == expected_origin)
|
|
566
|
-
|
|
766
|
+
# DEEP-GATE F-2: the log's own signing-key public bytes are the operand the log does not choose —
|
|
767
|
+
# pass them so a cosignature made with the log key never counts as a witness, whatever name it wears.
|
|
768
|
+
witnesses_ok, witnesses = witness_quorum(signed_note, witness_vkeys, threshold,
|
|
769
|
+
log_key_material=_log_key_material_of(log_vkey))
|
|
567
770
|
return {"ok": log_ok and witnesses_ok, "log_ok": log_ok,
|
|
568
771
|
"witnesses_ok": witnesses_ok, "witnesses": witnesses,
|
|
569
772
|
"origin": log_res["origin"], "expected_origin": expected_origin,
|
|
@@ -1052,8 +1052,16 @@ def _cmd_verify_proof(args: argparse.Namespace) -> int:
|
|
|
1052
1052
|
# `signer_present` trennt sie: false heisst "dieser Schluessel hat diese Note nicht
|
|
1053
1053
|
# signiert", true mit log_ok=false heisst "er hat, aber die Bytes stimmen nicht".
|
|
1054
1054
|
out["signer_present"] = bool(res.get("signer_present"))
|
|
1055
|
-
|
|
1056
|
-
|
|
1055
|
+
# DEEP-GATE F-4: carry the REASON a witness did not count, not just ok/alg/timestamp. The
|
|
1056
|
+
# CHANGELOG promises a relying party can tell "excluded by rule" from "signature invalid" —
|
|
1057
|
+
# that only held at the library level; the JSON projection dropped origin_excluded and detail
|
|
1058
|
+
# one layer before output, so an origin-excluded witness and a bad-signature one printed
|
|
1059
|
+
# byte-identically. Both are carried now (origin_excluded only when set; detail may be None).
|
|
1060
|
+
out["witnesses"] = {
|
|
1061
|
+
n: {"ok": w["ok"], "alg": w["alg"], "timestamp": w["timestamp"],
|
|
1062
|
+
**({"origin_excluded": True} if w.get("origin_excluded") else {}),
|
|
1063
|
+
"detail": w.get("detail")}
|
|
1064
|
+
for n, w in res["witnesses"].items()}
|
|
1057
1065
|
print(json.dumps(out, indent=2))
|
|
1058
1066
|
else:
|
|
1059
1067
|
# KONTROLLZEICHEN NEUTRALISIEREN, wie es `_cmd_verify` seit dem 2026-07-09 tut
|
|
@@ -1075,6 +1083,14 @@ def _cmd_verify_proof(args: argparse.Namespace) -> int:
|
|
|
1075
1083
|
n_ok = sum(1 for w in res["witnesses"].values() if w["ok"])
|
|
1076
1084
|
print(f"[{'PASS' if res['witnesses_ok'] else 'FAIL'}] witness-quorum: "
|
|
1077
1085
|
f"{n_ok} valid of {len(res['witnesses'])} known (threshold {args.threshold})")
|
|
1086
|
+
# DEEP-GATE re-gate F-6: the reason a witness did not count belongs on the HUMAN path too,
|
|
1087
|
+
# not only in --json. Without it an origin-excluded witness and a bad-signature one printed
|
|
1088
|
+
# the same "N valid of M known" line — the reader most likely to act is the one who sees
|
|
1089
|
+
# nothing. One indented line per non-verifying witness that carries a detail (name+keyID is
|
|
1090
|
+
# attacker-influenced, so neutralise both).
|
|
1091
|
+
for wname, w in res["witnesses"].items():
|
|
1092
|
+
if not w["ok"] and w.get("detail"):
|
|
1093
|
+
print(f" - {_safe_line(str(wname))}: {_safe_line(str(w['detail']))}")
|
|
1078
1094
|
print(f"[{'PASS' if res['inclusion_ok'] else 'FAIL'}] merkle-inclusion: "
|
|
1079
1095
|
f"index {res['index']} of {res['tree_size']}")
|
|
1080
1096
|
# Der Textpfad ist der, den ein Mensch liest — und er las bisher `[FAIL] log-signature:
|
|
@@ -288,9 +288,23 @@ def evaluate_public_transparency(
|
|
|
288
288
|
elif not witness_vkeys:
|
|
289
289
|
statuses["WITNESS_QUORUM"] = "FAIL"
|
|
290
290
|
errors.append("witnessQuorum required but no witness vkeys supplied (fail-closed)")
|
|
291
|
+
elif log_vkey is not None and cp._log_key_material_of(log_vkey) is None:
|
|
292
|
+
# DEEP-GATE re-gate F-9: THREE states, not two. A log_vkey was supplied but is unusable
|
|
293
|
+
# (malformed / surrogate name) — that is "not measurable", NOT "no log context". Treating it
|
|
294
|
+
# as no-context (log_key_material=None) silently switches the key-material exclusion off and
|
|
295
|
+
# lets the log vote in its own quorum under an alias with errors=[]. A relying party that
|
|
296
|
+
# SUPPLIED log context and had it silently dropped is exactly the hidden fail-open; fail-closed.
|
|
297
|
+
statuses["WITNESS_QUORUM"] = "FAIL"
|
|
298
|
+
errors.append("witnessQuorum: a log_vkey was supplied but is unusable (malformed) — the "
|
|
299
|
+
"self-witness key-material exclusion cannot be applied, fail-closed")
|
|
291
300
|
else:
|
|
292
301
|
try:
|
|
293
|
-
|
|
302
|
+
# DEEP-GATE F-2: when a log_vkey is known, pass its key material so the audited log's own
|
|
303
|
+
# signing key never counts toward the quorum, whatever name a cosignature line claims
|
|
304
|
+
# (origin-quorum rule). log_vkey may be absent here (optional param) — then the name test
|
|
305
|
+
# still applies, and this surface is EXPERIMENTAL/unwired anyway.
|
|
306
|
+
log_km = cp._log_key_material_of(log_vkey) if log_vkey else None
|
|
307
|
+
ok, _ = cp.witness_quorum(signed_note, witness_vkeys, th, log_key_material=log_km)
|
|
294
308
|
statuses["WITNESS_QUORUM"] = "PASS" if ok else "FAIL"
|
|
295
309
|
if not ok:
|
|
296
310
|
errors.append(f"witness quorum not met (need {th} distinct witnesses)")
|