proofbundle 3.6.0__tar.gz → 3.6.2__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.6.2/MANIFEST.in +39 -0
- proofbundle-3.6.2/PKG-INFO +270 -0
- proofbundle-3.6.2/README.md +205 -0
- proofbundle-3.6.2/conformance/README.md +73 -0
- proofbundle-3.6.2/conformance/bundle/coherent-rewrap-fails-expected-root/bundle.json +18 -0
- proofbundle-3.6.2/conformance/bundle/coherent-rewrap-fails-expected-root/case.json +19 -0
- proofbundle-3.6.2/conformance/bundle/coherent-rewrap-verifies-no-policy/bundle.json +18 -0
- proofbundle-3.6.2/conformance/bundle/coherent-rewrap-verifies-no-policy/case.json +16 -0
- proofbundle-3.6.2/conformance/bundle/corrupted-signature/bundle.json +23 -0
- proofbundle-3.6.2/conformance/bundle/corrupted-signature/case.json +9 -0
- proofbundle-3.6.2/conformance/bundle/duplicate-json-key/bundle.json +24 -0
- proofbundle-3.6.2/conformance/bundle/duplicate-json-key/case.json +9 -0
- proofbundle-3.6.2/conformance/bundle/forged-anchor-own-frozen/bundle.json +30 -0
- proofbundle-3.6.2/conformance/bundle/forged-anchor-own-frozen/case.json +11 -0
- proofbundle-3.6.2/conformance/bundle/n1-eval-sdjwt-graft-non-eval/bundle.json +20 -0
- proofbundle-3.6.2/conformance/bundle/n1-eval-sdjwt-graft-non-eval/case.json +15 -0
- proofbundle-3.6.2/conformance/bundle/sd-jwt-forged-issuer-identity/bundle.json +20 -0
- proofbundle-3.6.2/conformance/bundle/sd-jwt-forged-issuer-identity/case.json +9 -0
- proofbundle-3.6.2/conformance/bundle/sd-jwt-signed-but-unbound/bundle.json +20 -0
- proofbundle-3.6.2/conformance/bundle/sd-jwt-signed-but-unbound/case.json +9 -0
- proofbundle-3.6.2/conformance/bundle/sd-jwt-unsigned-unauthenticated/bundle.json +19 -0
- proofbundle-3.6.2/conformance/bundle/sd-jwt-unsigned-unauthenticated/case.json +9 -0
- proofbundle-3.6.2/conformance/bundle/tampered-payload/bundle.json +23 -0
- proofbundle-3.6.2/conformance/bundle/tampered-payload/case.json +9 -0
- proofbundle-3.6.2/conformance/bundle/tree-size-expectation-mismatch/bundle.json +16 -0
- proofbundle-3.6.2/conformance/bundle/tree-size-expectation-mismatch/case.json +18 -0
- proofbundle-3.6.2/conformance/bundle/valid-minimal/bundle.json +23 -0
- proofbundle-3.6.2/conformance/bundle/valid-minimal/case.json +9 -0
- proofbundle-3.6.2/conformance/common_vocabulary.py +155 -0
- proofbundle-3.6.2/conformance/cross_format.py +152 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/canonicalization-root-binding/MANIFEST.json +10 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/canonicalization-root-binding/case.json +24 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.jcs +1 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.jcs.ots +0 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.json +44 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/canonicalization-root-binding/evidence_eval_result.jcs +1 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/canonicalization-root-binding/evidence_eval_result.json +30 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/confirmed-anchor-lifecycle/MANIFEST.json +8 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/confirmed-anchor-lifecycle/case.json +42 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.jcs +1 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.jcs.ots +0 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.json +44 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/confirmed-anchor-lifecycle/evidence_eval_result.jcs +1 -0
- proofbundle-3.6.2/conformance/decision/crossimpl/confirmed-anchor-lifecycle/evidence_eval_result.json +30 -0
- proofbundle-3.6.2/conformance/manifest.json +62 -0
- proofbundle-3.6.2/conformance/relation/declared-supersedes-verified/case.json +21 -0
- proofbundle-3.6.2/conformance/relation/declared-supersedes-verified/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/declared-supersedes-verified/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/declared-supersedes-verified/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/declared-unresolved/case.json +17 -0
- proofbundle-3.6.2/conformance/relation/declared-unresolved/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/declared-unresolved/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-accept-path/case.json +25 -0
- proofbundle-3.6.2/conformance/relation/decoy-accept-path/policy.json +11 -0
- proofbundle-3.6.2/conformance/relation/decoy-accept-path/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/decoy-accept-path/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-accept-path/related_rx.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-correct-pass/case.json +26 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-correct-pass/policy.json +11 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-correct-pass/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-correct-pass/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-correct-pass/related_r0.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-correct-pass/related_rx.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-no-pin-old-behavior/case.json +26 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-no-pin-old-behavior/policy.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-no-pin-old-behavior/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-no-pin-old-behavior/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-no-pin-old-behavior/related_r0.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-no-pin-old-behavior/related_rx.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-target-mismatch/case.json +28 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-target-mismatch/policy.json +11 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-target-mismatch/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-target-mismatch/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-target-mismatch/related_r0.json +9 -0
- proofbundle-3.6.2/conformance/relation/decoy-parent-target-mismatch/related_rx.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/case.json +53 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_001.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_002.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_003.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_004.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_005.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_006.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_007.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_008.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_009.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_010.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_011.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_012.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_013.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_014.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_015.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_016.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_017.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_018.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_019.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_020.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_021.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_022.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_023.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_024.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_025.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_026.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_027.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_028.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_029.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_030.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_031.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_032.json +9 -0
- proofbundle-3.6.2/conformance/relation/depth-exceeded/related_033.json +9 -0
- proofbundle-3.6.2/conformance/relation/digest-mismatch/case.json +23 -0
- proofbundle-3.6.2/conformance/relation/digest-mismatch/policy.json +9 -0
- proofbundle-3.6.2/conformance/relation/digest-mismatch/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/digest-mismatch/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/digest-mismatch/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/generate_vectors.py +669 -0
- proofbundle-3.6.2/conformance/relation/malformed-digest/case.json +18 -0
- proofbundle-3.6.2/conformance/relation/malformed-digest/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/malformed-digest/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-declared-supersedes-verified/case.json +21 -0
- proofbundle-3.6.2/conformance/relation/outcome-declared-supersedes-verified/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/outcome-declared-supersedes-verified/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-declared-supersedes-verified/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-decoy-parent-target-mismatch/case.json +28 -0
- proofbundle-3.6.2/conformance/relation/outcome-decoy-parent-target-mismatch/policy.json +11 -0
- proofbundle-3.6.2/conformance/relation/outcome-decoy-parent-target-mismatch/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/outcome-decoy-parent-target-mismatch/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-decoy-parent-target-mismatch/related_r0.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-decoy-parent-target-mismatch/related_rx.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-digest-mismatch/case.json +23 -0
- proofbundle-3.6.2/conformance/relation/outcome-digest-mismatch/policy.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-digest-mismatch/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/outcome-digest-mismatch/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-digest-mismatch/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-relation-signer-unauthorized/case.json +25 -0
- proofbundle-3.6.2/conformance/relation/outcome-relation-signer-unauthorized/policy.json +14 -0
- proofbundle-3.6.2/conformance/relation/outcome-relation-signer-unauthorized/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/outcome-relation-signer-unauthorized/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-relation-signer-unauthorized/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-renews/case.json +21 -0
- proofbundle-3.6.2/conformance/relation/outcome-renews/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/outcome-renews/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-renews/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-silent-landing/case.json +17 -0
- proofbundle-3.6.2/conformance/relation/outcome-silent-landing/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/outcome-silent-landing/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/outcome-valid-baseline/case.json +18 -0
- proofbundle-3.6.2/conformance/relation/outcome-valid-baseline/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/outcome-valid-baseline/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-amends/case.json +20 -0
- proofbundle-3.6.2/conformance/relation/relation-amends/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/relation-amends/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-amends/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-corrects/case.json +20 -0
- proofbundle-3.6.2/conformance/relation/relation-corrects/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/relation-corrects/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-corrects/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-derivedfrom/case.json +20 -0
- proofbundle-3.6.2/conformance/relation/relation-derivedfrom/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/relation-derivedfrom/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-derivedfrom/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-retracts/case.json +20 -0
- proofbundle-3.6.2/conformance/relation/relation-retracts/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/relation-retracts/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-retracts/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-revises/case.json +20 -0
- proofbundle-3.6.2/conformance/relation/relation-revises/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/relation-revises/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-revises/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-cross-issuer-unauthorized/case.json +25 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-cross-issuer-unauthorized/policy.json +14 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-cross-issuer-unauthorized/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-cross-issuer-unauthorized/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-cross-issuer-unauthorized/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-cross-issuer-verified/case.json +24 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-cross-issuer-verified/policy.json +14 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-cross-issuer-verified/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-cross-issuer-verified/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-cross-issuer-verified/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-same-key-explicit/case.json +24 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-same-key-explicit/policy.json +11 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-same-key-explicit/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-same-key-explicit/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-same-key-explicit/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-verified-under-not-claim/case.json +25 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-verified-under-not-claim/policy.json +11 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-verified-under-not-claim/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-verified-under-not-claim/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/relation-signer-verified-under-not-claim/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/renews-vector/case.json +21 -0
- proofbundle-3.6.2/conformance/relation/renews-vector/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/renews-vector/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/renews-vector/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/retracts-then-use/case.json +21 -0
- proofbundle-3.6.2/conformance/relation/retracts-then-use/policy.json +7 -0
- proofbundle-3.6.2/conformance/relation/retracts-then-use/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/retracts-then-use/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/retracts-then-use/related_r.json +9 -0
- proofbundle-3.6.2/conformance/relation/silent-landing/case.json +17 -0
- proofbundle-3.6.2/conformance/relation/silent-landing/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/silent-landing/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/statement-malformed/case.json +17 -0
- proofbundle-3.6.2/conformance/relation/statement-malformed/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/statement-malformed/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-declared-unresolved/case.json +17 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-declared-unresolved/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-declared-unresolved/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-unauthorized/case.json +25 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-unauthorized/policy.json +14 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-unauthorized/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-unauthorized/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-unauthorized/related_t.json +9 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-verified-blocked/case.json +25 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-verified-blocked/policy.json +15 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-verified-blocked/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-verified-blocked/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-verified-blocked/related_t.json +9 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-verified-visible/case.json +23 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-verified-visible/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-verified-visible/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/statement-retracts-verified-visible/related_t.json +9 -0
- proofbundle-3.6.2/conformance/relation/statement-supersedes-verified/case.json +23 -0
- proofbundle-3.6.2/conformance/relation/statement-supersedes-verified/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/statement-supersedes-verified/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/statement-supersedes-verified/related_t.json +9 -0
- proofbundle-3.6.2/conformance/relation/t1-canonical-invalid-signature/case.json +16 -0
- proofbundle-3.6.2/conformance/relation/t1-canonical-invalid-signature/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/t1-canonical-invalid-signature/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/target-subject-ambiguous/case.json +24 -0
- proofbundle-3.6.2/conformance/relation/target-subject-ambiguous/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/target-subject-ambiguous/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/target-subject-ambiguous/related_r0.json +9 -0
- proofbundle-3.6.2/conformance/relation/target-subject-correct-pass/case.json +23 -0
- proofbundle-3.6.2/conformance/relation/target-subject-correct-pass/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/target-subject-correct-pass/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/target-subject-correct-pass/related_r0.json +9 -0
- proofbundle-3.6.2/conformance/relation/target-subject-mismatch/case.json +24 -0
- proofbundle-3.6.2/conformance/relation/target-subject-mismatch/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/target-subject-mismatch/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/target-subject-mismatch/related_r0.json +9 -0
- proofbundle-3.6.2/conformance/relation/target-subject-missing/case.json +24 -0
- proofbundle-3.6.2/conformance/relation/target-subject-missing/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/target-subject-missing/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/target-subject-missing/related_r0.json +9 -0
- proofbundle-3.6.2/conformance/relation/unauthorized-signer/case.json +21 -0
- proofbundle-3.6.2/conformance/relation/unauthorized-signer/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/unauthorized-signer/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/unauthorized-signer/related_b.json +9 -0
- proofbundle-3.6.2/conformance/relation/valid-baseline/case.json +18 -0
- proofbundle-3.6.2/conformance/relation/valid-baseline/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/valid-baseline/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/wrong-payloadtype-target/case.json +21 -0
- proofbundle-3.6.2/conformance/relation/wrong-payloadtype-target/pub.b64 +1 -0
- proofbundle-3.6.2/conformance/relation/wrong-payloadtype-target/receipt.json +9 -0
- proofbundle-3.6.2/conformance/relation/wrong-payloadtype-target/related_t.json +9 -0
- proofbundle-3.6.2/conformance/run_conformance.py +353 -0
- proofbundle-3.6.2/conformance/vector_schema.json +95 -0
- proofbundle-3.6.2/docs/adr/renewal_policy.example.json +8 -0
- proofbundle-3.6.2/docs/readiness_pack/AUDITOR_OPEN_POINTS.md +83 -0
- proofbundle-3.6.2/docs/readiness_pack/MANIFEST.sha256 +11 -0
- proofbundle-3.6.2/docs/readiness_pack/OPEN_QUESTIONS.md +29 -0
- proofbundle-3.6.2/docs/readiness_pack/PROGRESS.md +37 -0
- proofbundle-3.6.2/docs/readiness_pack/README.md +48 -0
- proofbundle-3.6.2/docs/readiness_pack/REPRODUCTION_RUNBOOK.md +92 -0
- proofbundle-3.6.2/docs/readiness_pack/calendar_independence.md +64 -0
- proofbundle-3.6.2/docs/readiness_pack/differential_matrix.md +28 -0
- proofbundle-3.6.2/docs/readiness_pack/index.json +110 -0
- proofbundle-3.6.2/docs/readiness_pack/proofbundle/readiness_pack.bundle.json +16 -0
- proofbundle-3.6.2/docs/readiness_pack/proofbundle/readiness_pack.pub.b64 +1 -0
- proofbundle-3.6.2/docs/readiness_pack/rust_parity_scope.md +50 -0
- proofbundle-3.6.2/docs/readiness_pack/tamper_resistance.md +49 -0
- proofbundle-3.6.2/docs/readiness_pack/threat_model_delta_360.md +49 -0
- proofbundle-3.6.2/examples/README.md +22 -0
- proofbundle-3.6.2/examples/anchors/chia-datalayer-invalid-root.json +23 -0
- proofbundle-3.6.2/examples/anchors/chia-datalayer-valid.json +24 -0
- proofbundle-3.6.2/examples/checkpoint_example.py +28 -0
- proofbundle-3.6.2/examples/decision_receipt_allow.json +107 -0
- proofbundle-3.6.2/examples/decision_receipt_deny.json +123 -0
- proofbundle-3.6.2/examples/decision_receipt_escalate.json +105 -0
- proofbundle-3.6.2/examples/decision_receipt_with_eval_ref.intoto.json +104 -0
- proofbundle-3.6.2/examples/eee_receipt.py +28 -0
- proofbundle-3.6.2/examples/example.tlog-proof +12 -0
- proofbundle-3.6.2/examples/example_bundle.json +23 -0
- proofbundle-3.6.2/examples/experimental_enclave.py +64 -0
- proofbundle-3.6.2/examples/inspect_hook_example.py +35 -0
- proofbundle-3.6.2/examples/inspect_receipt.py +32 -0
- proofbundle-3.6.2/examples/intoto/private-model-commitment.statement.json +55 -0
- proofbundle-3.6.2/examples/intoto/public-model.statement.json +50 -0
- proofbundle-3.6.2/examples/intoto/release-gate.statement.json +50 -0
- proofbundle-3.6.2/examples/intoto/svr.statement.json +24 -0
- proofbundle-3.6.2/examples/intoto_dsse_export.py +26 -0
- proofbundle-3.6.2/examples/lm_eval_receipt.py +31 -0
- proofbundle-3.6.2/examples/make_example.py +137 -0
- proofbundle-3.6.2/examples/persample_audit.py +89 -0
- proofbundle-3.6.2/examples/pytest_plugin_example.py +30 -0
- proofbundle-3.6.2/examples/rekor_interop.py +61 -0
- proofbundle-3.6.2/examples/tlog_proof_example.py +70 -0
- proofbundle-3.6.2/examples/trust_policy_decision_strict.json +18 -0
- proofbundle-3.6.2/examples/trust_policy_strict.json +18 -0
- proofbundle-3.6.2/formal/README.md +65 -0
- proofbundle-3.6.2/formal/model.py +284 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/pyproject.toml +7 -2
- proofbundle-3.6.2/schemas/action-outcome-v0.1.schema.json +110 -0
- proofbundle-3.6.2/schemas/decision-receipt-v0.1.schema.json +238 -0
- proofbundle-3.6.2/schemas/eval_claim_v0_1.schema.json +138 -0
- proofbundle-3.6.2/schemas/in_toto_statement_v1.schema.json +31 -0
- proofbundle-3.6.2/schemas/proofbundle_v0_1.schema.json +84 -0
- proofbundle-3.6.2/schemas/run-ledger-v0.1.schema.json +43 -0
- proofbundle-3.6.2/schemas/trust-pack-v0.1.schema.json +73 -0
- proofbundle-3.6.2/schemas/trust_policy_v0_1.schema.json +350 -0
- proofbundle-3.6.2/schemas/verification-summary-v0.1.schema.json +43 -0
- proofbundle-3.6.2/scripts/_build_anchor_fixture.py +43 -0
- proofbundle-3.6.2/scripts/audit_candidate_matrix.py +605 -0
- proofbundle-3.6.2/scripts/branch_base_check.py +89 -0
- proofbundle-3.6.2/scripts/build_reproducible.py +147 -0
- proofbundle-3.6.2/scripts/check_version_and_changelog.py +121 -0
- proofbundle-3.6.2/scripts/claims_hygiene_check.py +422 -0
- proofbundle-3.6.2/scripts/demo.sh +28 -0
- proofbundle-3.6.2/scripts/demo_tamper.sh +17 -0
- proofbundle-3.6.2/scripts/doc_link_check.py +74 -0
- proofbundle-3.6.2/scripts/findings_register.py +228 -0
- proofbundle-3.6.2/scripts/fork_pr_secret_isolation.py +404 -0
- proofbundle-3.6.2/scripts/fuzz_soak.py +287 -0
- proofbundle-3.6.2/scripts/gen_findings_register.py +147 -0
- proofbundle-3.6.2/scripts/gen_synthetic_ots_fixture.py +97 -0
- proofbundle-3.6.2/scripts/mutation_check.py +457 -0
- proofbundle-3.6.2/scripts/pre_tag_audit_gate.py +177 -0
- proofbundle-3.6.2/scripts/readiness_pack_gate.py +119 -0
- proofbundle-3.6.2/scripts/readiness_pack_manifest.py +132 -0
- proofbundle-3.6.2/scripts/render_demo.py +91 -0
- proofbundle-3.6.2/scripts/rust_parity_gate.py +298 -0
- proofbundle-3.6.2/scripts/rust_parity_registry.json +313 -0
- proofbundle-3.6.2/scripts/test_manifest_gate.py +181 -0
- proofbundle-3.6.2/scripts/type_confusion_gate.py +262 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/__init__.py +1 -1
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/_strict_json.py +56 -16
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/anchors.py +35 -3
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/assurance.py +11 -5
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/automation_verdict.py +17 -4
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/budget.py +9 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/bundle.py +144 -20
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/canonical.py +7 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/checkpoint.py +45 -3
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/cli.py +207 -81
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/decision.py +157 -52
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/dsse.py +13 -3
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/evalcard.py +39 -4
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/evalclaim.py +52 -13
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/evidence_pack.py +10 -1
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/experimental/enclave.py +5 -2
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/hashalg.py +6 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/hf_evals.py +20 -3
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/intoto.py +39 -15
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/kbjwt.py +26 -4
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/merkle.py +29 -1
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/outcome.py +132 -28
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/persample.py +32 -7
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/policy.py +112 -54
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/policy_profiles.py +15 -6
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/pqsig.py +5 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/prereg.py +42 -5
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/public_transparency.py +11 -1
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/relation.py +91 -22
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/relation_statement.py +50 -23
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/renewal.py +38 -5
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/run_ledger.py +37 -22
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/sdjwt.py +16 -3
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/sdjwt_issue.py +18 -4
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/sdjwt_vc.py +28 -2
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/signature.py +22 -10
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/statuslist.py +16 -3
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/subject_binding.py +34 -13
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/tlogproof.py +55 -21
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/trust_pack.py +81 -52
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/verification_summary.py +34 -22
- proofbundle-3.6.2/src/proofbundle.egg-info/PKG-INFO +270 -0
- proofbundle-3.6.2/src/proofbundle.egg-info/SOURCES.txt +602 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle.egg-info/requires.txt +9 -0
- proofbundle-3.6.2/tests/conftest.py +96 -0
- proofbundle-3.6.2/tests/fixtures/anchors/chia_datalayer_proof.json +23 -0
- proofbundle-3.6.2/tests/fixtures/anchors/freetsa_receipt_anchor.json +14 -0
- proofbundle-3.6.2/tests/fixtures/checkpoint/PROVENANCE.json +39 -0
- proofbundle-3.6.2/tests/fixtures/checkpoint/gosumdb_known_keys.go +9 -0
- proofbundle-3.6.2/tests/fixtures/checkpoint/rekor_v2_checkpoint.txt +5 -0
- proofbundle-3.6.2/tests/fixtures/checkpoint/sumdb_latest.txt +5 -0
- proofbundle-3.6.2/tests/fixtures/checkpoint/trusted_root.json +126 -0
- proofbundle-3.6.2/tests/fixtures/ed25519_speccheck_cases.LICENSE +201 -0
- proofbundle-3.6.2/tests/fixtures/ed25519_speccheck_cases.README.md +31 -0
- proofbundle-3.6.2/tests/fixtures/ed25519_speccheck_cases.json +1 -0
- proofbundle-3.6.2/tests/fixtures/eee_arc_easy.json +44 -0
- proofbundle-3.6.2/tests/fixtures/inspect_logs/safety_refusal_demo.eval +0 -0
- proofbundle-3.6.2/tests/fixtures/lm_eval_arc_easy_real.json +114 -0
- proofbundle-3.6.2/tests/fixtures/markovian_anchor_confirmed.json +12 -0
- proofbundle-3.6.2/tests/fixtures/mldsa_acvp/PROVENANCE.json +21 -0
- proofbundle-3.6.2/tests/fixtures/mldsa_acvp/mldsa_sigver_slice.json +49 -0
- proofbundle-3.6.2/tests/fixtures/ots/PROVENANCE.json +123 -0
- proofbundle-3.6.2/tests/fixtures/ots/block358391.json +1 -0
- proofbundle-3.6.2/tests/fixtures/ots/hello-world.txt +1 -0
- proofbundle-3.6.2/tests/fixtures/ots/hello-world.txt.ots +0 -0
- proofbundle-3.6.2/tests/fixtures/ots/incomplete.txt +1 -0
- proofbundle-3.6.2/tests/fixtures/ots/incomplete.txt.ots +0 -0
- proofbundle-3.6.2/tests/fixtures/ots/known-and-unknown-notary.txt +2 -0
- proofbundle-3.6.2/tests/fixtures/ots/known-and-unknown-notary.txt.ots +0 -0
- proofbundle-3.6.2/tests/fixtures/ots/merkle2.txt +2 -0
- proofbundle-3.6.2/tests/fixtures/ots/merkle2.txt.ots +0 -0
- proofbundle-3.6.2/tests/fixtures/ots/synthetic-upgraded-sha256.block.json +6 -0
- proofbundle-3.6.2/tests/fixtures/ots/synthetic-upgraded-sha256.txt +1 -0
- proofbundle-3.6.2/tests/fixtures/ots/synthetic-upgraded-sha256.txt.ots +0 -0
- proofbundle-3.6.2/tests/fixtures/ots/two-calendars.txt +1 -0
- proofbundle-3.6.2/tests/fixtures/ots/two-calendars.txt.ots +0 -0
- proofbundle-3.6.2/tests/fixtures/promptfoo_results_v3.json +58 -0
- proofbundle-3.6.2/tests/fixtures/rekor_inclusion_25579.json +34 -0
- proofbundle-3.6.2/tests/fixtures/rfc6962_vectors.json +119 -0
- proofbundle-3.6.2/tests/fixtures/sdjwt_disclosure_vector.json +8 -0
- proofbundle-3.6.2/tests/fixtures/sdjwt_reference_eddsa.json +11 -0
- proofbundle-3.6.2/tests/fixtures/sdjwtvc/PROVENANCE.json +24 -0
- proofbundle-3.6.2/tests/fixtures/sdjwtvc/sdjwtvc_examples.txt +5 -0
- proofbundle-3.6.2/tests/fixtures/sdjwtvc/sdjwtvc_issuer_pubkey.json +9 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_audit_candidate_360.py +50 -40
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_budget.py +20 -8
- proofbundle-3.6.2/tests/test_bughunt_361_automation_failopen.py +131 -0
- proofbundle-3.6.2/tests/test_bughunt_361_never_raise.py +443 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_conformance.py +6 -0
- proofbundle-3.6.2/tests/test_conformance_retention_361.py +56 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_content_root_property.py +3 -2
- proofbundle-3.6.2/tests/test_cross_format_singleton_361.py +72 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_dup_key_reject.py +29 -12
- proofbundle-3.6.2/tests/test_findings_register_rt10.py +233 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_fork_pr_secret_isolation.py +5 -1
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_hf_entry_verify_eee_digest.py +7 -2
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_intoto_dsse.py +4 -3
- proofbundle-3.6.2/tests/test_jcs_mandatory_361.py +90 -0
- proofbundle-3.6.2/tests/test_legacy_assurance_deprecation_361.py +107 -0
- proofbundle-3.6.2/tests/test_manifest_lock.json +10 -0
- proofbundle-3.6.2/tests/test_never_raise_361.py +75 -0
- proofbundle-3.6.2/tests/test_never_raise_primary_arg_property.py +79 -0
- proofbundle-3.6.2/tests/test_never_raise_recursion_361.py +154 -0
- proofbundle-3.6.2/tests/test_never_raise_surface_family_property.py +285 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_relation_property.py +6 -2
- proofbundle-3.6.2/tests/test_relation_same_key_361.py +84 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_relation_signer_target_340.py +6 -2
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_relation_statement.py +6 -2
- proofbundle-3.6.2/tests/test_relation_subject_pin_361.py +266 -0
- proofbundle-3.6.2/tests/test_reproducible_build_361.py +78 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_roadmap_frontload_foundations.py +45 -0
- proofbundle-3.6.2/tests/test_sdist_packaging_361.py +76 -0
- proofbundle-3.6.2/tests/test_sibling_never_raise_361.py +607 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_tlogproof.py +20 -2
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_trust_pack.py +7 -3
- proofbundle-3.6.0/PKG-INFO +0 -374
- proofbundle-3.6.0/README.md +0 -317
- proofbundle-3.6.0/src/proofbundle.egg-info/PKG-INFO +0 -374
- proofbundle-3.6.0/src/proofbundle.egg-info/SOURCES.txt +0 -213
- {proofbundle-3.6.0 → proofbundle-3.6.2}/LICENSE +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/setup.cfg +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/_inspect_registry.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/_integration.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/adapters/__init__.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/adapters/_provenance.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/adapters/eee.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/adapters/inspect_ai.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/adapters/lm_eval.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/adapters/promptfoo.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/adapters/samples.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/anchors_chia.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/anchors_chia_add.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/anchors_markovian.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/anchors_ots.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/anchors_rfc3161.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/beacon.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/demo.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/eee_eval_schema.json +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/emit.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/errors.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/experimental/__init__.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/inspect_hook.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/policies/decision-receipt-template-v1.json +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/policies/research-preview-v1.json +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/policies/strict-eval-authenticated-root-template-v1.json +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/policies/strict-eval-template-v1.json +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/policies/strict-prereg-template-v1.json +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/py.typed +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle/pytest_plugin.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle.egg-info/dependency_links.txt +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle.egg-info/entry_points.txt +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/src/proofbundle.egg-info/top_level.txt +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_adapters.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_adversarial.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_anchor_hardening_321.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_anchor_longevity_property.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_anchor_target_trustedtime.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_anchors_chia.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_anchors_chia_add.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_anchors_chia_claims.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_anchors_generic.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_anchors_markovian.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_anchors_ots.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_anchors_rfc3161.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_assurance.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_automation_verdict.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_beacon.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_branch_base_check.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_bundle.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_bundle_robustness.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_canonical.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_checkpoint.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_checkpoint_external_vectors.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_checkpoint_quorum_property.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_claims_hygiene.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_cli.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_cli_eval.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_cli_require_anchor.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_cosignature.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_cosignature_mldsa.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_decision_anchors.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_decision_cli.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_decision_evidence.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_decision_fuzz.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_decision_hardening.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_decision_policy.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_decision_schema.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_decision_validator_api.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_decision_verify.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_demo.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_docs_truth.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_dsse_adversarial.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_ed25519_semantics.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_eee.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_emit.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_enclave_assurance.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_eval_claim_schema.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_eval_evidence_class.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_evalcard.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_evalclaim.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_evidence_pack.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_examples.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_experimental_enclave.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_fuzz_parsers.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_fuzz_soak_regression.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_hashalg.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_hf_evals.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_inspect_hook.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_intoto.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_intoto_claims_hygiene.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_intoto_content_root_migration.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_intoto_eval_result.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_intoto_examples.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_intoto_spec_diff.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_intoto_svr.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_kbjwt.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_lens_review_fixes_3_1_3.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_merkle.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_merkle_consistency_property.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_merkle_property.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_mldsa_acvp_vectors.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_official_vectors.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_ok_semantics.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_ots_calendar_hardening.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_ots_external_vectors.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_outcome_receiver_corroboration.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_outcome_verify.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_oversized_int_guard.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_persample.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_pinned_key_validation.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_policy_explain_lint.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_policy_lifecycle_purpose.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_policy_profiles.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_policy_templates.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_pqsig.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_predicate_type_enforcement.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_prereg.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_promptfoo.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_provenance.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_public_transparency.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_pytest_plugin.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_rekor_interop.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_relation_profile.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_relation_statement_rust_parity.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_release_integrity_gate.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_renewal.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_renewal_external_token_glue.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_renewal_policy.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_renewal_signed.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_rfc6962_external_vectors.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_root_authenticity.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_run_ledger.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_rust_parity_gate.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_schema.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_schema_parity.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_sdjwt_adversarial.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_sdjwt_duplicate_cnf.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_sdjwt_issue.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_sdjwt_reference.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_sdjwt_resource_budget.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_sdjwt_vc.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_sdjwt_verify_binding.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_sdjwtvc_external_vectors.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_signature.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_statuslist.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_subject_binding.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_tree_context_authenticity.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_trust_pack_crypto_agility.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_trust_pack_outcome_receivers_role.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_trust_pack_payloadtype_negatives.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_trust_policy.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_verification_summary.py +0 -0
- {proofbundle-3.6.0 → proofbundle-3.6.2}/tests/test_verify_matrix.py +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# PB-2026-0717-02: the published sdist shipped tests/ WITHOUT their runtime assets (fixtures, schemas,
|
|
2
|
+
# examples, conformance corpus, formal-model results, the scripts the tests invoke) → the full sdist
|
|
3
|
+
# pytest aborted with collection errors. This allowlist grafts exactly the assets the shipped tests need
|
|
4
|
+
# to COLLECT AND RUN.
|
|
5
|
+
#
|
|
6
|
+
# Self-testable, honestly (PKG-2026-0718-01 / RE-GATE): `pip install <sdist> && pytest` runs the
|
|
7
|
+
# package-level suite green. A documented subset of tests assert facts about the REPO/CI/Rust/docs LAYOUT
|
|
8
|
+
# (`.github/workflows` contents, the Rust verifier source under `tools/`, `SPEC.md`/`CITATION.cff`, audit
|
|
9
|
+
# records) — material this allowlist DELIBERATELY prunes (not a Python-package artifact). Those repo-context
|
|
10
|
+
# tests SKIP outside a git checkout (tests/conftest.py::_REPO_CONTEXT_TESTS) rather than fail, so a
|
|
11
|
+
# from-sdist run is clean — the honest form of "self-testable" (package tests run; repo-layout tests declare
|
|
12
|
+
# themselves N/A).
|
|
13
|
+
#
|
|
14
|
+
# Per-directory allowlist (Befund C: not `package-data` — that targets the wheel/import package; the
|
|
15
|
+
# sdist is the right vehicle for top-level tests/ + their assets). Large / non-Python-sdist material is
|
|
16
|
+
# pruned: `tools/` is the Rust verifier + its 138M build tree (Rust runs from a git checkout with a
|
|
17
|
+
# toolchain, never from the Python sdist — a category error to ship it), and build/CI-meta is excluded.
|
|
18
|
+
# The shipped-example policy tests/test_renewal_policy.py loads is included by exact path (PKG-2026-0718-02)
|
|
19
|
+
# — NOT `graft docs/adr`, which would also ship the ADR markdowns whose internal links reference pruned
|
|
20
|
+
# repo files (breaking test_docs_truth from the sdist).
|
|
21
|
+
graft tests
|
|
22
|
+
graft schemas
|
|
23
|
+
graft examples
|
|
24
|
+
graft conformance
|
|
25
|
+
graft formal
|
|
26
|
+
graft docs/readiness_pack
|
|
27
|
+
include docs/adr/renewal_policy.example.json
|
|
28
|
+
graft scripts
|
|
29
|
+
|
|
30
|
+
# Never ship: the Rust verifier + build artifacts, repo/CI meta, caches, VCS, big review packs.
|
|
31
|
+
prune tools
|
|
32
|
+
prune audit_artifacts
|
|
33
|
+
prune .github
|
|
34
|
+
prune target
|
|
35
|
+
global-exclude __pycache__
|
|
36
|
+
global-exclude *.py[cod]
|
|
37
|
+
global-exclude *.so
|
|
38
|
+
global-exclude *.rs
|
|
39
|
+
global-exclude *.orig
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: proofbundle
|
|
3
|
+
Version: 3.6.2
|
|
4
|
+
Summary: Emit and verify portable cryptographic evidence bundles, offline: Ed25519 + RFC 6962 Merkle + optional SD-JWT.
|
|
5
|
+
Author: Konrad Gruszka
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://b7n0de.com
|
|
8
|
+
Project-URL: Repository, https://github.com/b7n0de/proofbundle
|
|
9
|
+
Project-URL: Issues, https://github.com/b7n0de/proofbundle/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/b7n0de/proofbundle/blob/main/CHANGELOG.md
|
|
11
|
+
Project-URL: Documentation, https://github.com/b7n0de/proofbundle#readme
|
|
12
|
+
Keywords: cryptography,merkle,transparency-log,ed25519,sd-jwt,verifiable-credentials,attestation,provenance,rfc6962
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Classifier: Topic :: Security :: Cryptography
|
|
23
|
+
Requires-Python: >=3.10
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: cryptography>=42
|
|
27
|
+
Requires-Dist: rfc8785>=0.1.4
|
|
28
|
+
Provides-Extra: sdjwt
|
|
29
|
+
Provides-Extra: eval
|
|
30
|
+
Requires-Dist: rfc8785>=0.1.4; extra == "eval"
|
|
31
|
+
Provides-Extra: anchors
|
|
32
|
+
Requires-Dist: rfc3161-client>=1.0.6; extra == "anchors"
|
|
33
|
+
Requires-Dist: opentimestamps<0.5,>=0.4.5; extra == "anchors"
|
|
34
|
+
Requires-Dist: rfc8785>=0.1.4; extra == "anchors"
|
|
35
|
+
Provides-Extra: adapters
|
|
36
|
+
Provides-Extra: chia
|
|
37
|
+
Provides-Extra: experimental
|
|
38
|
+
Provides-Extra: pq
|
|
39
|
+
Requires-Dist: cryptography>=48; extra == "pq"
|
|
40
|
+
Provides-Extra: formal
|
|
41
|
+
Requires-Dist: z3-solver>=4.12; extra == "formal"
|
|
42
|
+
Provides-Extra: pytest
|
|
43
|
+
Requires-Dist: pytest>=7; extra == "pytest"
|
|
44
|
+
Provides-Extra: test
|
|
45
|
+
Requires-Dist: pytest>=7; extra == "test"
|
|
46
|
+
Requires-Dist: hypothesis>=6; extra == "test"
|
|
47
|
+
Requires-Dist: PyYAML>=6; extra == "test"
|
|
48
|
+
Requires-Dist: jsonschema>=4; extra == "test"
|
|
49
|
+
Requires-Dist: sd-jwt>=0.10; extra == "test"
|
|
50
|
+
Requires-Dist: rfc8785>=0.1.4; extra == "test"
|
|
51
|
+
Provides-Extra: inspect
|
|
52
|
+
Requires-Dist: inspect_ai<0.4,>=0.3.112; extra == "inspect"
|
|
53
|
+
Provides-Extra: dev
|
|
54
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
55
|
+
Requires-Dist: ruff>=0.5; extra == "dev"
|
|
56
|
+
Requires-Dist: jsonschema>=4; extra == "dev"
|
|
57
|
+
Requires-Dist: mypy>=1.8; extra == "dev"
|
|
58
|
+
Requires-Dist: build>=1; extra == "dev"
|
|
59
|
+
Requires-Dist: hypothesis>=6; extra == "dev"
|
|
60
|
+
Requires-Dist: rfc8785>=0.1.4; extra == "dev"
|
|
61
|
+
Requires-Dist: sd-jwt>=0.10; extra == "dev"
|
|
62
|
+
Requires-Dist: PyYAML>=6; extra == "dev"
|
|
63
|
+
Requires-Dist: inspect_ai<0.4,>=0.3.112; extra == "dev"
|
|
64
|
+
Dynamic: license-file
|
|
65
|
+
|
|
66
|
+
<div align="center">
|
|
67
|
+
|
|
68
|
+
<picture>
|
|
69
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/b7n0de/proofbundle/main/assets/b7n0de-hase-logo-dark.png">
|
|
70
|
+
<img alt="b7n0de, Verified AI Work, pink rabbit mascot over the B7N0DE wordmark" src="https://raw.githubusercontent.com/b7n0de/proofbundle/main/assets/b7n0de-hase-logo.png" width="200">
|
|
71
|
+
</picture>
|
|
72
|
+
|
|
73
|
+
<h1>proofbundle</h1>
|
|
74
|
+
|
|
75
|
+
**AI eval results need receipts.**
|
|
76
|
+
|
|
77
|
+
Turn an AI evaluation result into one portable, offline-verifiable receipt. It proves *who signed
|
|
78
|
+
these exact bytes* and *that nothing changed since* — not that the number is true. Ed25519 + RFC 6962
|
|
79
|
+
Merkle, one file, no server, no network.
|
|
80
|
+
|
|
81
|
+
[](https://github.com/b7n0de/proofbundle/actions/workflows/ci.yml)
|
|
82
|
+
[](https://github.com/b7n0de/proofbundle/actions/workflows/demo-reproducible.yml)
|
|
83
|
+
[](https://pypi.org/project/proofbundle/)
|
|
84
|
+
[](https://pypi.org/project/proofbundle/)
|
|
85
|
+
[](https://github.com/b7n0de/proofbundle/blob/main/LICENSE)
|
|
86
|
+
[](https://doi.org/10.5281/zenodo.21110642)
|
|
87
|
+
|
|
88
|
+
**Reviewing this for adoption?** Start with the 30-minute adversarial audit path: **[docs/REVIEWERS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/REVIEWERS.md)**.
|
|
89
|
+
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
## 60-second try (offline)
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
pip install "proofbundle[eval]"
|
|
96
|
+
proofbundle demo # honest receipt => OK, six tampers each => FAILED, sample swap caught
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The demo runs entirely in memory and exits non-zero if any tamper slips through, so it doubles as a
|
|
100
|
+
self-test.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# verify a real hosted receipt without writing any code — the verify runs fully offline:
|
|
104
|
+
curl -fsSL https://raw.githubusercontent.com/b7n0de/proofbundle/main/examples/example_bundle.json -o receipt.json
|
|
105
|
+
proofbundle verify receipt.json # CRYPTO: OK (exit 0 ok · 1 fail · 2 malformed · 3 policy)
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Emit your own receipt, apply a trust policy, start from a shipped template, or run the Inspect-native
|
|
109
|
+
path (METR Task Standard / UK-AISI ecosystem, mockllm, no API key): **[docs/DEMO.md](https://github.com/b7n0de/proofbundle/blob/main/docs/DEMO.md)** ·
|
|
110
|
+
Inspect walkthrough **[docs/INSPECT_HAPPY_PATH.md](https://github.com/b7n0de/proofbundle/blob/main/docs/INSPECT_HAPPY_PATH.md)**.
|
|
111
|
+
|
|
112
|
+
## The problem
|
|
113
|
+
|
|
114
|
+
Every AI eval number you read — a safety benchmark, a capability score, a leaderboard entry — is an
|
|
115
|
+
**unverifiable claim**. You trust the lab. There is no portable way to check, offline, that a result
|
|
116
|
+
was signed by a stated party, has not been altered, and covers the samples it claims.
|
|
117
|
+
|
|
118
|
+
proofbundle is that check: a small MIT-licensed Python tool (a compact, auditable trusted core that
|
|
119
|
+
depends only on [`cryptography`](https://cryptography.io)) that turns a result into a signed receipt
|
|
120
|
+
anyone can verify from a single file. In plain terms it is the cash-register receipt of an AI test
|
|
121
|
+
result: it shows who claimed the number and that nobody quietly changed it, not that the test was
|
|
122
|
+
good. Without a receipt there is nothing to check at all.
|
|
123
|
+
|
|
124
|
+
## What a receipt proves, and what it doesn't
|
|
125
|
+
|
|
126
|
+
| ✅ It proves | ❌ It does **not** prove |
|
|
127
|
+
|---|---|
|
|
128
|
+
| These exact bytes were signed by this key (**authorship**) | That the number is **true** |
|
|
129
|
+
| Nothing changed since signing (**integrity**, Ed25519 + RFC 6962) | That the **issuer is honest** |
|
|
130
|
+
| The result is attributable to a stated issuer | That the **eval was well-designed** |
|
|
131
|
+
| A threshold was met while hiding the model/dataset (salted commitments) | That there was **no cherry-picking** — unless pre-registered |
|
|
132
|
+
| Optionally: individual samples, offline-auditable (per-sample Merkle) | That the **computation was correct** — that needs a TEE or independent reproduction |
|
|
133
|
+
|
|
134
|
+
This boundary is the point, not a weakness. A receipt makes a claim **attributable, tamper-evident,
|
|
135
|
+
and — with pre-registration and per-sample auditing — bounded and spot-checkable**. Full detail:
|
|
136
|
+
**[THREAT_MODEL.md](https://github.com/b7n0de/proofbundle/blob/main/THREAT_MODEL.md)**.
|
|
137
|
+
|
|
138
|
+
## How it fits together
|
|
139
|
+
|
|
140
|
+
*(diagram renders on GitHub — [view it there](https://github.com/b7n0de/proofbundle#how-it-fits-together); PyPI shows the source)*
|
|
141
|
+
|
|
142
|
+
```mermaid
|
|
143
|
+
flowchart LR
|
|
144
|
+
H["eval harness<br/>inspect_ai · lm-eval · promptfoo · pytest"] --> A["adapter → signed claim<br/>salted commitments · provenance · samples root"]
|
|
145
|
+
A --> R["receipt<br/>one portable file"]
|
|
146
|
+
R --> V{{"proofbundle verify — offline"}}
|
|
147
|
+
V --> C["signature · Merkle inclusion · SD-JWT/KB ·<br/>witness quorum · status list · sample openings"]
|
|
148
|
+
C --> OK(["CRYPTO: OK / FAILED"])
|
|
149
|
+
style V fill:#D6248A,stroke:#D6248A,color:#fff
|
|
150
|
+
style OK fill:#D6248A,stroke:#D6248A,color:#fff
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
proofbundle is a **practical, released, offline verifier — complementary to TEE and zero-knowledge
|
|
154
|
+
approaches**, not a replacement for any of them. The neighbourhood, honest about the line each one
|
|
155
|
+
crosses that a receipt does not (maturity labels stated so nothing reads as a settled standard):
|
|
156
|
+
|
|
157
|
+
| Neighbour | What it contributes that a receipt does not | Maturity |
|
|
158
|
+
|---|---|---|
|
|
159
|
+
| **K-Veritas** ([arXiv 2605.08586](https://arxiv.org/abs/2605.08586)) | the academic case for tamper-evident, execution-bound experiment reports | preprint |
|
|
160
|
+
| **Attestable Audits** ([arXiv 2506.23706](https://arxiv.org/abs/2506.23706)) | that the computation actually ran, inside a trusted enclave | preprint |
|
|
161
|
+
| **BenchJack** ([arXiv 2605.12673](https://arxiv.org/abs/2605.12673)) | whether the benchmark itself is gameable (reward-hacking) | preprint |
|
|
162
|
+
| **Evaluation Cards** ([arXiv 2606.09809](https://arxiv.org/abs/2606.09809)) | a structured, human-facing account of what a result means | preprint |
|
|
163
|
+
| in-toto / Sigstore, SCITT / Rekor v2, OpenSSF Model Signing | artifact-provenance, public transparency, model-artifact signing | stable |
|
|
164
|
+
|
|
165
|
+
Tool-by-tool comparison: **[INTEROP.md](https://github.com/b7n0de/proofbundle/blob/main/INTEROP.md)**.
|
|
166
|
+
|
|
167
|
+
## What's in the box
|
|
168
|
+
|
|
169
|
+
Each line is a one-sentence summary; the linked doc carries the exact flags, exit codes and
|
|
170
|
+
version history (see also [CHANGELOG.md](https://github.com/b7n0de/proofbundle/blob/main/CHANGELOG.md)).
|
|
171
|
+
|
|
172
|
+
- **Core** — Ed25519 signature + RFC 6962 / 9162 Merkle inclusion, verified fully offline against a
|
|
173
|
+
real [Sigstore Rekor](https://docs.sigstore.dev/) proof, so correctness is not self-referential.
|
|
174
|
+
- **Eval receipts** — a signed claim (`metric ⋈ threshold`, `n`, salted model/dataset commitments,
|
|
175
|
+
assurance level, provenance) from your run. [EVAL_CLAIM.md](https://github.com/b7n0de/proofbundle/blob/main/EVAL_CLAIM.md)
|
|
176
|
+
- **Selective disclosure** — SD-JWT ([RFC 9901](https://datatracker.ietf.org/doc/rfc9901/)) with Key
|
|
177
|
+
Binding: prove a threshold while withholding the exact score (unsigned or unbound disclosures fail closed).
|
|
178
|
+
- **Transparency-log interop** — C2SP `tlog-checkpoint` / cosignature / `.tlog-proof`, with
|
|
179
|
+
post-quantum **ML-DSA-44** witness cosignatures and optional Token-Status-List revocation.
|
|
180
|
+
- **Per-sample audit** — an auditor challenges random indices (fresh nonce or **public randomness
|
|
181
|
+
beacon**); 300 samples catch 1% sample-doctoring at 95% confidence, regardless of run size — a
|
|
182
|
+
challenge the issuer chose itself does not give this guarantee.
|
|
183
|
+
- **Pre-registration** — `proofbundle prereg <plan>` commits to the protocol before the run, so
|
|
184
|
+
best-of-many publishing becomes visible.
|
|
185
|
+
- **Integrations** — opt-in inspect_ai end-of-task hook, pytest plugin, and a Hugging Face Community
|
|
186
|
+
Evals bridge. [INTEGRATIONS.md](https://github.com/b7n0de/proofbundle/blob/main/INTEGRATIONS.md)
|
|
187
|
+
- **External time anchors** *(beta, `[anchors]` extra)* — optional evidence of *when* a receipt
|
|
188
|
+
existed, from a party the producer does not control; RFC 3161 and OpenTimestamps built in, plus a
|
|
189
|
+
bring-your-own-type interface. Trust comes only from the relying party. [docs/ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/ANCHORS.md)
|
|
190
|
+
- **Universal content root** *(`jcs-sha256-v1`)* — SHA-256 over the RFC 8785 (JCS) canonical bytes of
|
|
191
|
+
the full pre-signature statement, so a content root survives counter-signing and key rotation;
|
|
192
|
+
cross-implementation interop proven. [ADR 0002](https://github.com/b7n0de/proofbundle/blob/main/docs/adr/0002-universal-content-root.md)
|
|
193
|
+
- **Decision & action-outcome receipts** — a signed *decision* (verdict, policy boundary,
|
|
194
|
+
digest-bound evidence, and what was *not* checked) and a separately signed *outcome* with role
|
|
195
|
+
separation (executor ≠ decision maker) — never a claim that the decision was correct.
|
|
196
|
+
[decision-receipt.md](https://github.com/b7n0de/proofbundle/blob/main/docs/predicates/decision-receipt.md) · [action-outcome.md](https://github.com/b7n0de/proofbundle/blob/main/docs/predicates/action-outcome.md)
|
|
197
|
+
|
|
198
|
+
## Install
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
pip install proofbundle # core: offline verify + plain emit (dependency-free)
|
|
202
|
+
pip install "proofbundle[eval]" # + eval receipts, prereg, and the demo (RFC 8785 JCS canonicalizer)
|
|
203
|
+
pip install "proofbundle[inspect]" # inspect_ai adapter + hook
|
|
204
|
+
pip install "proofbundle[pq]" # verify ML-DSA-44 (post-quantum) witness cosignatures
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Requires Python 3.10+. The verify path never rolls its own crypto — Ed25519 comes from
|
|
208
|
+
`cryptography`; Merkle hashing is RFC 6962.
|
|
209
|
+
|
|
210
|
+
## Post-quantum posture (honest)
|
|
211
|
+
|
|
212
|
+
proofbundle is **not** "quantum-safe" as a whole. Its hash-based layers (SHA-256, RFC 6962 / 9162
|
|
213
|
+
Merkle, RFC 8785 canonicalization, and the OpenTimestamps / `chia-datalayer` anchors) stay secure —
|
|
214
|
+
Grover only halves SHA-256's effective strength, leaving a ~128-bit quantum margin. The Ed25519
|
|
215
|
+
receipt signature (and the RFC 3161 anchor's classical TSA certificate) are quantum-vulnerable to
|
|
216
|
+
Shor. The attack that matters is **back-dated forgery**, and the defense is a hash-based time anchor:
|
|
217
|
+
it proves the original receipt existed *before* any such capability, so a forged receipt has no
|
|
218
|
+
matching anchor. The witness side already carries post-quantum **ML-DSA-44** (FIPS 204) cosignatures;
|
|
219
|
+
a post-quantum *payload* signature is on the roadmap. Detail: [docs/ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/ANCHORS.md).
|
|
220
|
+
|
|
221
|
+
## Cite this work
|
|
222
|
+
|
|
223
|
+
If proofbundle helped your evaluation pipeline, please cite it. Machine-readable metadata is in
|
|
224
|
+
[`CITATION.cff`](https://github.com/b7n0de/proofbundle/blob/main/CITATION.cff). The archival software record is on Zenodo under concept
|
|
225
|
+
DOI [10.5281/zenodo.21110642](https://doi.org/10.5281/zenodo.21110642); the Technical Note (design write-up) under concept DOI
|
|
226
|
+
[10.5281/zenodo.21230466](https://doi.org/10.5281/zenodo.21230466), also linked from [b7n0de.com/proofbundle](https://b7n0de.com/proofbundle).
|
|
227
|
+
|
|
228
|
+
## Docs
|
|
229
|
+
|
|
230
|
+
| For… | Read |
|
|
231
|
+
|---|---|
|
|
232
|
+
| Skeptics (why not SHA-256 / Sigstore / trust the issuer) | [docs/FAQ.md](https://github.com/b7n0de/proofbundle/blob/main/docs/FAQ.md) |
|
|
233
|
+
| New to this? plain-terms glossary | [docs/GLOSSARY.md](https://github.com/b7n0de/proofbundle/blob/main/docs/GLOSSARY.md) |
|
|
234
|
+
| Reviewers (30-minute adversarial audit path) | [docs/REVIEWERS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/REVIEWERS.md) |
|
|
235
|
+
| Where every trust anchor comes from | [docs/TRUST_ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/TRUST_ANCHORS.md) |
|
|
236
|
+
| The demos, tier by tier | [docs/DEMO.md](https://github.com/b7n0de/proofbundle/blob/main/docs/DEMO.md) |
|
|
237
|
+
| The normative format + verification order | [SPEC.md](https://github.com/b7n0de/proofbundle/blob/main/SPEC.md) |
|
|
238
|
+
| Honest comparison to Rekor / in-toto / OMS / ValiChord | [INTEROP.md](https://github.com/b7n0de/proofbundle/blob/main/INTEROP.md) |
|
|
239
|
+
| Regulatory mapping (and what to never claim) | [COMPLIANCE.md](https://github.com/b7n0de/proofbundle/blob/main/COMPLIANCE.md) |
|
|
240
|
+
| Funders / role fit | [docs/PROJECT_BRIEF.md](https://github.com/b7n0de/proofbundle/blob/main/docs/PROJECT_BRIEF.md) |
|
|
241
|
+
| **Preview:** TEE-attestation bridge (RATS/EAT, `[experimental]`) | [docs/EXPERIMENTAL_ENCLAVE.md](https://github.com/b7n0de/proofbundle/blob/main/docs/EXPERIMENTAL_ENCLAVE.md) |
|
|
242
|
+
|
|
243
|
+
## Status, scope and roadmap
|
|
244
|
+
|
|
245
|
+
Beta, SemVer-committed, with a CI test suite behind a mutation gate + property-based parser fuzzing.
|
|
246
|
+
Correctness is anchored to external RFC 6962 vectors and a real Rekor proof, not just its own
|
|
247
|
+
bundles; releases carry PEP 740 / SLSA build provenance. It is **not** a log service, a full in-toto
|
|
248
|
+
client, a TEE, a consensus network, or a compliance product by itself — it is the small, offline,
|
|
249
|
+
standards-native receipt layer between them. Security policy: [SECURITY.md](https://github.com/b7n0de/proofbundle/blob/main/SECURITY.md).
|
|
250
|
+
|
|
251
|
+
**Roadmap (stated honestly, not yet built):** a post-quantum *payload* signature (today the
|
|
252
|
+
post-quantum coverage is witness-side ML-DSA-44 only), and a CLI flag to select the content-root
|
|
253
|
+
algorithm (`jcs-sha256-v1` is the signed default). **Already shipped at preview/experimental
|
|
254
|
+
maturity** (install extra `[experimental]`, API/wire-format may still change): a TEE-attestation
|
|
255
|
+
bridge (RATS/EAT, RFC 9334 + RFC 9711) making `assurance_level = enclave_attested` independently
|
|
256
|
+
verifiable — [docs/EXPERIMENTAL_ENCLAVE.md](https://github.com/b7n0de/proofbundle/blob/main/docs/EXPERIMENTAL_ENCLAVE.md).
|
|
257
|
+
|
|
258
|
+
## Contributing
|
|
259
|
+
|
|
260
|
+
See [CONTRIBUTING.md](https://github.com/b7n0de/proofbundle/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/b7n0de/proofbundle/blob/main/CODE_OF_CONDUCT.md). Good first issues are labeled
|
|
261
|
+
[`good-first-issue`](https://github.com/b7n0de/proofbundle/labels/good-first-issue); security findings go through [SECURITY.md](https://github.com/b7n0de/proofbundle/blob/main/SECURITY.md).
|
|
262
|
+
The verifier core aims to stay small, dependency-light, and correct.
|
|
263
|
+
|
|
264
|
+
## License
|
|
265
|
+
|
|
266
|
+
MIT — see [LICENSE](https://github.com/b7n0de/proofbundle/blob/main/LICENSE).
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
<p align="center"><sub>proofbundle is part of <b>b7n0de</b>, Verified AI Work · <a href="https://b7n0de.com">b7n0de.com</a></sub></p>
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/b7n0de/proofbundle/main/assets/b7n0de-hase-logo-dark.png">
|
|
5
|
+
<img alt="b7n0de, Verified AI Work, pink rabbit mascot over the B7N0DE wordmark" src="https://raw.githubusercontent.com/b7n0de/proofbundle/main/assets/b7n0de-hase-logo.png" width="200">
|
|
6
|
+
</picture>
|
|
7
|
+
|
|
8
|
+
<h1>proofbundle</h1>
|
|
9
|
+
|
|
10
|
+
**AI eval results need receipts.**
|
|
11
|
+
|
|
12
|
+
Turn an AI evaluation result into one portable, offline-verifiable receipt. It proves *who signed
|
|
13
|
+
these exact bytes* and *that nothing changed since* — not that the number is true. Ed25519 + RFC 6962
|
|
14
|
+
Merkle, one file, no server, no network.
|
|
15
|
+
|
|
16
|
+
[](https://github.com/b7n0de/proofbundle/actions/workflows/ci.yml)
|
|
17
|
+
[](https://github.com/b7n0de/proofbundle/actions/workflows/demo-reproducible.yml)
|
|
18
|
+
[](https://pypi.org/project/proofbundle/)
|
|
19
|
+
[](https://pypi.org/project/proofbundle/)
|
|
20
|
+
[](https://github.com/b7n0de/proofbundle/blob/main/LICENSE)
|
|
21
|
+
[](https://doi.org/10.5281/zenodo.21110642)
|
|
22
|
+
|
|
23
|
+
**Reviewing this for adoption?** Start with the 30-minute adversarial audit path: **[docs/REVIEWERS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/REVIEWERS.md)**.
|
|
24
|
+
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
## 60-second try (offline)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install "proofbundle[eval]"
|
|
31
|
+
proofbundle demo # honest receipt => OK, six tampers each => FAILED, sample swap caught
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The demo runs entirely in memory and exits non-zero if any tamper slips through, so it doubles as a
|
|
35
|
+
self-test.
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# verify a real hosted receipt without writing any code — the verify runs fully offline:
|
|
39
|
+
curl -fsSL https://raw.githubusercontent.com/b7n0de/proofbundle/main/examples/example_bundle.json -o receipt.json
|
|
40
|
+
proofbundle verify receipt.json # CRYPTO: OK (exit 0 ok · 1 fail · 2 malformed · 3 policy)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Emit your own receipt, apply a trust policy, start from a shipped template, or run the Inspect-native
|
|
44
|
+
path (METR Task Standard / UK-AISI ecosystem, mockllm, no API key): **[docs/DEMO.md](https://github.com/b7n0de/proofbundle/blob/main/docs/DEMO.md)** ·
|
|
45
|
+
Inspect walkthrough **[docs/INSPECT_HAPPY_PATH.md](https://github.com/b7n0de/proofbundle/blob/main/docs/INSPECT_HAPPY_PATH.md)**.
|
|
46
|
+
|
|
47
|
+
## The problem
|
|
48
|
+
|
|
49
|
+
Every AI eval number you read — a safety benchmark, a capability score, a leaderboard entry — is an
|
|
50
|
+
**unverifiable claim**. You trust the lab. There is no portable way to check, offline, that a result
|
|
51
|
+
was signed by a stated party, has not been altered, and covers the samples it claims.
|
|
52
|
+
|
|
53
|
+
proofbundle is that check: a small MIT-licensed Python tool (a compact, auditable trusted core that
|
|
54
|
+
depends only on [`cryptography`](https://cryptography.io)) that turns a result into a signed receipt
|
|
55
|
+
anyone can verify from a single file. In plain terms it is the cash-register receipt of an AI test
|
|
56
|
+
result: it shows who claimed the number and that nobody quietly changed it, not that the test was
|
|
57
|
+
good. Without a receipt there is nothing to check at all.
|
|
58
|
+
|
|
59
|
+
## What a receipt proves, and what it doesn't
|
|
60
|
+
|
|
61
|
+
| ✅ It proves | ❌ It does **not** prove |
|
|
62
|
+
|---|---|
|
|
63
|
+
| These exact bytes were signed by this key (**authorship**) | That the number is **true** |
|
|
64
|
+
| Nothing changed since signing (**integrity**, Ed25519 + RFC 6962) | That the **issuer is honest** |
|
|
65
|
+
| The result is attributable to a stated issuer | That the **eval was well-designed** |
|
|
66
|
+
| A threshold was met while hiding the model/dataset (salted commitments) | That there was **no cherry-picking** — unless pre-registered |
|
|
67
|
+
| Optionally: individual samples, offline-auditable (per-sample Merkle) | That the **computation was correct** — that needs a TEE or independent reproduction |
|
|
68
|
+
|
|
69
|
+
This boundary is the point, not a weakness. A receipt makes a claim **attributable, tamper-evident,
|
|
70
|
+
and — with pre-registration and per-sample auditing — bounded and spot-checkable**. Full detail:
|
|
71
|
+
**[THREAT_MODEL.md](https://github.com/b7n0de/proofbundle/blob/main/THREAT_MODEL.md)**.
|
|
72
|
+
|
|
73
|
+
## How it fits together
|
|
74
|
+
|
|
75
|
+
*(diagram renders on GitHub — [view it there](https://github.com/b7n0de/proofbundle#how-it-fits-together); PyPI shows the source)*
|
|
76
|
+
|
|
77
|
+
```mermaid
|
|
78
|
+
flowchart LR
|
|
79
|
+
H["eval harness<br/>inspect_ai · lm-eval · promptfoo · pytest"] --> A["adapter → signed claim<br/>salted commitments · provenance · samples root"]
|
|
80
|
+
A --> R["receipt<br/>one portable file"]
|
|
81
|
+
R --> V{{"proofbundle verify — offline"}}
|
|
82
|
+
V --> C["signature · Merkle inclusion · SD-JWT/KB ·<br/>witness quorum · status list · sample openings"]
|
|
83
|
+
C --> OK(["CRYPTO: OK / FAILED"])
|
|
84
|
+
style V fill:#D6248A,stroke:#D6248A,color:#fff
|
|
85
|
+
style OK fill:#D6248A,stroke:#D6248A,color:#fff
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
proofbundle is a **practical, released, offline verifier — complementary to TEE and zero-knowledge
|
|
89
|
+
approaches**, not a replacement for any of them. The neighbourhood, honest about the line each one
|
|
90
|
+
crosses that a receipt does not (maturity labels stated so nothing reads as a settled standard):
|
|
91
|
+
|
|
92
|
+
| Neighbour | What it contributes that a receipt does not | Maturity |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| **K-Veritas** ([arXiv 2605.08586](https://arxiv.org/abs/2605.08586)) | the academic case for tamper-evident, execution-bound experiment reports | preprint |
|
|
95
|
+
| **Attestable Audits** ([arXiv 2506.23706](https://arxiv.org/abs/2506.23706)) | that the computation actually ran, inside a trusted enclave | preprint |
|
|
96
|
+
| **BenchJack** ([arXiv 2605.12673](https://arxiv.org/abs/2605.12673)) | whether the benchmark itself is gameable (reward-hacking) | preprint |
|
|
97
|
+
| **Evaluation Cards** ([arXiv 2606.09809](https://arxiv.org/abs/2606.09809)) | a structured, human-facing account of what a result means | preprint |
|
|
98
|
+
| in-toto / Sigstore, SCITT / Rekor v2, OpenSSF Model Signing | artifact-provenance, public transparency, model-artifact signing | stable |
|
|
99
|
+
|
|
100
|
+
Tool-by-tool comparison: **[INTEROP.md](https://github.com/b7n0de/proofbundle/blob/main/INTEROP.md)**.
|
|
101
|
+
|
|
102
|
+
## What's in the box
|
|
103
|
+
|
|
104
|
+
Each line is a one-sentence summary; the linked doc carries the exact flags, exit codes and
|
|
105
|
+
version history (see also [CHANGELOG.md](https://github.com/b7n0de/proofbundle/blob/main/CHANGELOG.md)).
|
|
106
|
+
|
|
107
|
+
- **Core** — Ed25519 signature + RFC 6962 / 9162 Merkle inclusion, verified fully offline against a
|
|
108
|
+
real [Sigstore Rekor](https://docs.sigstore.dev/) proof, so correctness is not self-referential.
|
|
109
|
+
- **Eval receipts** — a signed claim (`metric ⋈ threshold`, `n`, salted model/dataset commitments,
|
|
110
|
+
assurance level, provenance) from your run. [EVAL_CLAIM.md](https://github.com/b7n0de/proofbundle/blob/main/EVAL_CLAIM.md)
|
|
111
|
+
- **Selective disclosure** — SD-JWT ([RFC 9901](https://datatracker.ietf.org/doc/rfc9901/)) with Key
|
|
112
|
+
Binding: prove a threshold while withholding the exact score (unsigned or unbound disclosures fail closed).
|
|
113
|
+
- **Transparency-log interop** — C2SP `tlog-checkpoint` / cosignature / `.tlog-proof`, with
|
|
114
|
+
post-quantum **ML-DSA-44** witness cosignatures and optional Token-Status-List revocation.
|
|
115
|
+
- **Per-sample audit** — an auditor challenges random indices (fresh nonce or **public randomness
|
|
116
|
+
beacon**); 300 samples catch 1% sample-doctoring at 95% confidence, regardless of run size — a
|
|
117
|
+
challenge the issuer chose itself does not give this guarantee.
|
|
118
|
+
- **Pre-registration** — `proofbundle prereg <plan>` commits to the protocol before the run, so
|
|
119
|
+
best-of-many publishing becomes visible.
|
|
120
|
+
- **Integrations** — opt-in inspect_ai end-of-task hook, pytest plugin, and a Hugging Face Community
|
|
121
|
+
Evals bridge. [INTEGRATIONS.md](https://github.com/b7n0de/proofbundle/blob/main/INTEGRATIONS.md)
|
|
122
|
+
- **External time anchors** *(beta, `[anchors]` extra)* — optional evidence of *when* a receipt
|
|
123
|
+
existed, from a party the producer does not control; RFC 3161 and OpenTimestamps built in, plus a
|
|
124
|
+
bring-your-own-type interface. Trust comes only from the relying party. [docs/ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/ANCHORS.md)
|
|
125
|
+
- **Universal content root** *(`jcs-sha256-v1`)* — SHA-256 over the RFC 8785 (JCS) canonical bytes of
|
|
126
|
+
the full pre-signature statement, so a content root survives counter-signing and key rotation;
|
|
127
|
+
cross-implementation interop proven. [ADR 0002](https://github.com/b7n0de/proofbundle/blob/main/docs/adr/0002-universal-content-root.md)
|
|
128
|
+
- **Decision & action-outcome receipts** — a signed *decision* (verdict, policy boundary,
|
|
129
|
+
digest-bound evidence, and what was *not* checked) and a separately signed *outcome* with role
|
|
130
|
+
separation (executor ≠ decision maker) — never a claim that the decision was correct.
|
|
131
|
+
[decision-receipt.md](https://github.com/b7n0de/proofbundle/blob/main/docs/predicates/decision-receipt.md) · [action-outcome.md](https://github.com/b7n0de/proofbundle/blob/main/docs/predicates/action-outcome.md)
|
|
132
|
+
|
|
133
|
+
## Install
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
pip install proofbundle # core: offline verify + plain emit (dependency-free)
|
|
137
|
+
pip install "proofbundle[eval]" # + eval receipts, prereg, and the demo (RFC 8785 JCS canonicalizer)
|
|
138
|
+
pip install "proofbundle[inspect]" # inspect_ai adapter + hook
|
|
139
|
+
pip install "proofbundle[pq]" # verify ML-DSA-44 (post-quantum) witness cosignatures
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Requires Python 3.10+. The verify path never rolls its own crypto — Ed25519 comes from
|
|
143
|
+
`cryptography`; Merkle hashing is RFC 6962.
|
|
144
|
+
|
|
145
|
+
## Post-quantum posture (honest)
|
|
146
|
+
|
|
147
|
+
proofbundle is **not** "quantum-safe" as a whole. Its hash-based layers (SHA-256, RFC 6962 / 9162
|
|
148
|
+
Merkle, RFC 8785 canonicalization, and the OpenTimestamps / `chia-datalayer` anchors) stay secure —
|
|
149
|
+
Grover only halves SHA-256's effective strength, leaving a ~128-bit quantum margin. The Ed25519
|
|
150
|
+
receipt signature (and the RFC 3161 anchor's classical TSA certificate) are quantum-vulnerable to
|
|
151
|
+
Shor. The attack that matters is **back-dated forgery**, and the defense is a hash-based time anchor:
|
|
152
|
+
it proves the original receipt existed *before* any such capability, so a forged receipt has no
|
|
153
|
+
matching anchor. The witness side already carries post-quantum **ML-DSA-44** (FIPS 204) cosignatures;
|
|
154
|
+
a post-quantum *payload* signature is on the roadmap. Detail: [docs/ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/ANCHORS.md).
|
|
155
|
+
|
|
156
|
+
## Cite this work
|
|
157
|
+
|
|
158
|
+
If proofbundle helped your evaluation pipeline, please cite it. Machine-readable metadata is in
|
|
159
|
+
[`CITATION.cff`](https://github.com/b7n0de/proofbundle/blob/main/CITATION.cff). The archival software record is on Zenodo under concept
|
|
160
|
+
DOI [10.5281/zenodo.21110642](https://doi.org/10.5281/zenodo.21110642); the Technical Note (design write-up) under concept DOI
|
|
161
|
+
[10.5281/zenodo.21230466](https://doi.org/10.5281/zenodo.21230466), also linked from [b7n0de.com/proofbundle](https://b7n0de.com/proofbundle).
|
|
162
|
+
|
|
163
|
+
## Docs
|
|
164
|
+
|
|
165
|
+
| For… | Read |
|
|
166
|
+
|---|---|
|
|
167
|
+
| Skeptics (why not SHA-256 / Sigstore / trust the issuer) | [docs/FAQ.md](https://github.com/b7n0de/proofbundle/blob/main/docs/FAQ.md) |
|
|
168
|
+
| New to this? plain-terms glossary | [docs/GLOSSARY.md](https://github.com/b7n0de/proofbundle/blob/main/docs/GLOSSARY.md) |
|
|
169
|
+
| Reviewers (30-minute adversarial audit path) | [docs/REVIEWERS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/REVIEWERS.md) |
|
|
170
|
+
| Where every trust anchor comes from | [docs/TRUST_ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/TRUST_ANCHORS.md) |
|
|
171
|
+
| The demos, tier by tier | [docs/DEMO.md](https://github.com/b7n0de/proofbundle/blob/main/docs/DEMO.md) |
|
|
172
|
+
| The normative format + verification order | [SPEC.md](https://github.com/b7n0de/proofbundle/blob/main/SPEC.md) |
|
|
173
|
+
| Honest comparison to Rekor / in-toto / OMS / ValiChord | [INTEROP.md](https://github.com/b7n0de/proofbundle/blob/main/INTEROP.md) |
|
|
174
|
+
| Regulatory mapping (and what to never claim) | [COMPLIANCE.md](https://github.com/b7n0de/proofbundle/blob/main/COMPLIANCE.md) |
|
|
175
|
+
| Funders / role fit | [docs/PROJECT_BRIEF.md](https://github.com/b7n0de/proofbundle/blob/main/docs/PROJECT_BRIEF.md) |
|
|
176
|
+
| **Preview:** TEE-attestation bridge (RATS/EAT, `[experimental]`) | [docs/EXPERIMENTAL_ENCLAVE.md](https://github.com/b7n0de/proofbundle/blob/main/docs/EXPERIMENTAL_ENCLAVE.md) |
|
|
177
|
+
|
|
178
|
+
## Status, scope and roadmap
|
|
179
|
+
|
|
180
|
+
Beta, SemVer-committed, with a CI test suite behind a mutation gate + property-based parser fuzzing.
|
|
181
|
+
Correctness is anchored to external RFC 6962 vectors and a real Rekor proof, not just its own
|
|
182
|
+
bundles; releases carry PEP 740 / SLSA build provenance. It is **not** a log service, a full in-toto
|
|
183
|
+
client, a TEE, a consensus network, or a compliance product by itself — it is the small, offline,
|
|
184
|
+
standards-native receipt layer between them. Security policy: [SECURITY.md](https://github.com/b7n0de/proofbundle/blob/main/SECURITY.md).
|
|
185
|
+
|
|
186
|
+
**Roadmap (stated honestly, not yet built):** a post-quantum *payload* signature (today the
|
|
187
|
+
post-quantum coverage is witness-side ML-DSA-44 only), and a CLI flag to select the content-root
|
|
188
|
+
algorithm (`jcs-sha256-v1` is the signed default). **Already shipped at preview/experimental
|
|
189
|
+
maturity** (install extra `[experimental]`, API/wire-format may still change): a TEE-attestation
|
|
190
|
+
bridge (RATS/EAT, RFC 9334 + RFC 9711) making `assurance_level = enclave_attested` independently
|
|
191
|
+
verifiable — [docs/EXPERIMENTAL_ENCLAVE.md](https://github.com/b7n0de/proofbundle/blob/main/docs/EXPERIMENTAL_ENCLAVE.md).
|
|
192
|
+
|
|
193
|
+
## Contributing
|
|
194
|
+
|
|
195
|
+
See [CONTRIBUTING.md](https://github.com/b7n0de/proofbundle/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/b7n0de/proofbundle/blob/main/CODE_OF_CONDUCT.md). Good first issues are labeled
|
|
196
|
+
[`good-first-issue`](https://github.com/b7n0de/proofbundle/labels/good-first-issue); security findings go through [SECURITY.md](https://github.com/b7n0de/proofbundle/blob/main/SECURITY.md).
|
|
197
|
+
The verifier core aims to stay small, dependency-light, and correct.
|
|
198
|
+
|
|
199
|
+
## License
|
|
200
|
+
|
|
201
|
+
MIT — see [LICENSE](https://github.com/b7n0de/proofbundle/blob/main/LICENSE).
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
<p align="center"><sub>proofbundle is part of <b>b7n0de</b>, Verified AI Work · <a href="https://b7n0de.com">b7n0de.com</a></sub></p>
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# proofbundle conformance corpus
|
|
2
|
+
|
|
3
|
+
Versioned, digest-pinned test vectors that a proofbundle verifier (this one, or an
|
|
4
|
+
independent implementation) must agree on. Every case is verified **offline** by
|
|
5
|
+
`run_conformance.py`: no calendar contact, no network — the specific Bitcoin block
|
|
6
|
+
**merkle root** a case needs is frozen inside its `case.json`, independently sourced and
|
|
7
|
+
byte-reproducible.
|
|
8
|
+
|
|
9
|
+
Run it:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
make conformance # skips anchor sub-checks if opentimestamps is absent
|
|
13
|
+
python conformance/run_conformance.py --require-anchors # full run (needs the [anchors] extra)
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Case format
|
|
17
|
+
|
|
18
|
+
`manifest.json` lists case directories. Each holds a `case.json`:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
{caseId, kind, input, expected: {...}, specRefs[], rationale, attribution}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
`expected` is the whole point of the corpus: a case declares what it proves **and what it
|
|
25
|
+
does not**. A green run therefore never overclaims — a case that is canonicalization-correct
|
|
26
|
+
but not schema-conformant records the exact finding count as an *expected-fail*, it does not
|
|
27
|
+
hide it.
|
|
28
|
+
|
|
29
|
+
## Kinds
|
|
30
|
+
|
|
31
|
+
### `decision_crossimpl`
|
|
32
|
+
|
|
33
|
+
A decision-receipt statement pair (decision + referenced evidence) produced by a **second,
|
|
34
|
+
independent implementation**, checked for cross-implementation agreement:
|
|
35
|
+
|
|
36
|
+
- `.jcs` bytes are byte-identical with proofbundle's RFC 8785 canonical output;
|
|
37
|
+
- both content roots (`statement_content_root`, jcs-sha256-v1) recompute to the `MANIFEST.json`
|
|
38
|
+
values and to `expected`;
|
|
39
|
+
- `decision.evidenceRefs[*].digest` binds the evidence **content root**;
|
|
40
|
+
- `validate_decision_predicate` returns exactly `expected.decision_predicate_findings` (an
|
|
41
|
+
expected-fail when the external predicate does not yet match `decision-receipt/v0.1`);
|
|
42
|
+
- the OpenTimestamps anchor, when present, resolves to the expected status offline
|
|
43
|
+
(`confirmed` against a frozen merkle root, or `pending`). The verifier rejects a wrong
|
|
44
|
+
frozen root (`block_mismatch`), so confirmation is not a blind pass — that negative is
|
|
45
|
+
exercised by `tests/test_anchors_ots.py`; the corpus itself runs the positive check.
|
|
46
|
+
|
|
47
|
+
### `native_bundle`
|
|
48
|
+
|
|
49
|
+
A native proofbundle bundle checked against the CLI **verify exit-code contract**
|
|
50
|
+
(`0` crypto OK · `1` verification failure · `2` malformed · `3` policy unmet). The exit code is
|
|
51
|
+
the conformance contract, so each case declares the exact code it must produce; the fail-closed
|
|
52
|
+
floor requires a `native_bundle` case to declare `exitCode`. These lock core verifier properties
|
|
53
|
+
onto the gate — a valid bundle verifies, a **duplicate JSON key** is rejected as malformed (the C1
|
|
54
|
+
Bishop-Fox parser-differential defense), a single flipped payload byte fails the signature.
|
|
55
|
+
|
|
56
|
+
## Cases today
|
|
57
|
+
|
|
58
|
+
| caseId | proves | does NOT prove |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| `decision-crossimpl-confirmed-anchor-lifecycle` | RFC 8785 canonicalization + content-root binding cross-impl, **and** a confirmed Bitcoin anchor at block 957504 (OTS proof committed root matches the real block merkle root, independently fetched, verified offline) | `decision-receipt/v0.1` schema conformance (predicate reports 12 findings) |
|
|
61
|
+
| `decision-crossimpl-canonicalization-root-binding` | RFC 8785 canonicalization + content-root binding cross-impl | schema conformance (12 findings, expected-fail) **and** a confirmed anchor (still pending) |
|
|
62
|
+
|
|
63
|
+
Both vectors are contributed by MarkovianProtocol / Colin (audit-anchor), vendored digest-pinned
|
|
64
|
+
as pure data, credited. The gap between "canonicalization proven" and "full v0.1 conformance" is
|
|
65
|
+
recorded in `audit_artifacts/crossimpl_fixture_gap_20260711.md`; a case graduates to a full
|
|
66
|
+
end-to-end `decision-receipt/v0.1` conformance case after a schema-conformant regeneration and a
|
|
67
|
+
confirmed anchor.
|
|
68
|
+
|
|
69
|
+
## Adding a case
|
|
70
|
+
|
|
71
|
+
Never edit an accepted vector's bytes in place — a fixture change must be a new case (or an
|
|
72
|
+
explicit, reviewed re-pin), so accepted expectations cannot drift silently. Add the directory,
|
|
73
|
+
its `case.json`, and a line in `manifest.json`.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "proofbundle/v0.1",
|
|
3
|
+
"payload_b64": "Y29uZm9ybWFuY2UgY29oZXJlbnQtcmV3cmFwIHZlY3RvciBwYXlsb2Fk",
|
|
4
|
+
"signature": {
|
|
5
|
+
"alg": "ed25519",
|
|
6
|
+
"public_key_b64": "uJcyYE8/ZQ5VdPb0Z2Va966zIvyWxtjg+IbJyf5lMWY=",
|
|
7
|
+
"sig_b64": "63Uo9D7tYWg/A3iUd2vixamTpkRXNb0oQYlGzPaA1KoSJWtOmcNj3MvHw0WInS0oq+ZSPWwQi3JM3Z5KBGx6DA=="
|
|
8
|
+
},
|
|
9
|
+
"merkle": {
|
|
10
|
+
"hash_alg": "sha256-rfc6962",
|
|
11
|
+
"leaf_index": 0,
|
|
12
|
+
"tree_size": 2,
|
|
13
|
+
"inclusion_proof_b64": [
|
|
14
|
+
"UmoE65hbRCJfopCqQtKC4dcIJagjPb/kxPBxBh3darw="
|
|
15
|
+
],
|
|
16
|
+
"root_b64": "tGjjQxDAn0Pz9kRcXnLNiuGPsoq2rNOTgE8loZfOpjs="
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"caseId": "native-bundle-coherent-rewrap-fails-expected-root",
|
|
3
|
+
"kind": "native_bundle",
|
|
4
|
+
"input": "bundle.json",
|
|
5
|
+
"verifyArgs": [
|
|
6
|
+
"--expected-root",
|
|
7
|
+
"lYN6OaeW1AVBrmEIF0ZoNKdvduoh5/hQCQLBQipfBaw="
|
|
8
|
+
],
|
|
9
|
+
"attribution": "proofbundle (P0-A / ADR 0004: relying-party root authentication)",
|
|
10
|
+
"expected": {
|
|
11
|
+
"exitCode": 1,
|
|
12
|
+
"rejected": true
|
|
13
|
+
},
|
|
14
|
+
"specRefs": [
|
|
15
|
+
"docs/adr/0004-native-root-authenticity.md",
|
|
16
|
+
"SPEC.md"
|
|
17
|
+
],
|
|
18
|
+
"rationale": "The SAME rewrap FAILS (exit 1) when the relying party authenticates the root with the ORIGINAL single-leaf root via --expected-root: the rewrapped root does not match. Closes the coherent-rewrap; a second implementation MUST reject it too."
|
|
19
|
+
}
|