============================= test session starts =============================
platform win32 -- Python 3.12.10, pytest-8.4.2, pluggy-1.6.0 -- <python-prefix>\Scripts\python.exe
rootdir: <source-root>\agent-manifest\python
configfile: pyproject.toml
collecting ... collected 146 items

tests/test_signing.py::test_pre_image_excludes_attestation PASSED        [  0%]
tests/test_signing.py::test_pre_image_excludes_signature PASSED          [  1%]
tests/test_signing.py::test_pre_image_includes_all_signed_fields PASSED  [  2%]
tests/test_signing.py::test_pre_image_is_rfc8785 PASSED                  [  2%]
tests/test_signing.py::test_ed25519_sign_verify_roundtrip PASSED         [  3%]
tests/test_signing.py::test_ed25519_wrong_message_fails PASSED           [  4%]
tests/test_signing.py::test_ed25519_wrong_key_fails PASSED               [  4%]
tests/test_signing.py::test_ed25519_truncated_signature_fails PASSED     [  5%]
tests/test_signing.py::test_ed25519_wrong_algorithm_label_not_accepted PASSED [  6%]
tests/test_signing.py::test_ed25519_signed_fields_list_correct PASSED    [  6%]
tests/test_signing.py::test_ed25519_sign_block_validates_against_model PASSED [  7%]
tests/test_signing.py::test_ed25519_small_order_key_rejected PASSED      [  8%]
tests/test_signing.py::test_ed25519_all_small_order_points_rejected PASSED [  8%]
tests/test_signing.py::test_ed25519_truncated_sig_raises_invalid_signature PASSED [  9%]
tests/test_signing.py::test_verify_bytes_rejects_wrong_length_before_calling_the_backend PASSED [ 10%]
tests/test_signing.py::test_b64url_decode_rejects_plus PASSED            [ 10%]
tests/test_signing.py::test_b64url_decode_rejects_slash PASSED           [ 11%]
tests/test_signing.py::test_b64url_decode_accepts_valid PASSED           [ 12%]
tests/test_signing.py::test_b64url_decode_rejects_trailing_newline PASSED [ 13%]
tests/test_signing.py::test_b64url_decode_rejects_non_str PASSED         [ 13%]
tests/test_signing.py::test_ed25519_public_key_roundtrip_b64url PASSED   [ 14%]
tests/test_signing.py::test_ml_dsa65_sign_verify_roundtrip PASSED        [ 15%]
tests/test_signing.py::test_ml_dsa65_wrong_message_fails PASSED          [ 15%]
tests/test_signing.py::test_hybrid_sign_verify_roundtrip PASSED          [ 16%]
tests/test_signing.py::test_hybrid_tampered_classical_fails PASSED       [ 17%]
tests/test_signing.py::test_hybrid_tampered_pq_fails PASSED              [ 17%]
tests/test_signing.py::test_hybrid_both_components_cover_same_pre_image PASSED [ 18%]
tests/test_signing.py::test_signed_fields_match_spec_coverage_table PASSED [ 19%]
tests/test_signing.py::test_pre_image_normalizes_hitl_approvals_to_empty PASSED [ 19%]
tests/test_signing.py::test_pre_image_keeps_hitl_required_tamper_evident PASSED [ 20%]
tests/test_signing.py::test_approvals_attach_post_issuance_without_resigning PASSED [ 21%]
tests/test_signing.py::test_newly_signed_fields_are_tamper_evident PASSED [ 21%]
tests/test_signing.py::test_ed25519_keypair_repr_redacts_private_key PASSED [ 22%]
tests/test_signing.py::test_ed25519_keypair_str_equals_repr PASSED       [ 23%]
tests/test_signing.py::test_ed25519_keypair_private_b64url_roundtrip PASSED [ 23%]
tests/test_signing.py::test_ed25519_from_private_bytes_valid PASSED      [ 24%]
tests/test_signing.py::test_ed25519_from_private_bytes_malformed_raises PASSED [ 25%]
tests/test_signing.py::test_ed25519_from_private_bytes_too_short_raises PASSED [ 26%]
tests/test_signing.py::test_ed25519_verifier_wrong_length_key_raises PASSED [ 26%]
tests/test_signing.py::test_ed25519_verifier_zero_length_key_raises PASSED [ 27%]
tests/test_signing.py::test_ed25519_verifier_rsa_sized_bytes_raises PASSED [ 28%]
tests/test_signing.py::test_ml_dsa65_verifier_wrong_length_key_raises[0] PASSED [ 28%]
tests/test_signing.py::test_ml_dsa65_verifier_wrong_length_key_raises[1] PASSED [ 29%]
tests/test_signing.py::test_ml_dsa65_verifier_wrong_length_key_raises[1951] PASSED [ 30%]
tests/test_signing.py::test_ml_dsa65_verifier_wrong_length_key_raises[1953] PASSED [ 30%]
tests/test_signing.py::test_ml_dsa65_verifier_wrong_length_key_raises[3000] PASSED [ 31%]
tests/test_signing.py::test_ml_dsa65_verifier_correct_length_key_is_accepted PASSED [ 32%]
tests/test_signing.py::test_hybrid_verifier_wrong_length_pq_component_raises[0] PASSED [ 32%]
tests/test_signing.py::test_hybrid_verifier_wrong_length_pq_component_raises[1] PASSED [ 33%]
tests/test_signing.py::test_hybrid_verifier_wrong_length_pq_component_raises[1951] PASSED [ 34%]
tests/test_signing.py::test_hybrid_verifier_wrong_length_pq_component_raises[1953] PASSED [ 34%]
tests/test_signing.py::test_hybrid_verifier_wrong_length_pq_component_raises[3000] PASSED [ 35%]
tests/test_signing.py::test_ed25519_signer_signed_at_is_iso8601 PASSED   [ 36%]
tests/test_signing.py::test_ml_dsa65_signer_signed_at_is_iso8601 PASSED  [ 36%]
tests/test_signing.py::test_hybrid_signer_signed_at_is_iso8601 PASSED    [ 37%]
tests/test_delegation_hitl.py::test_hop_pre_image_includes_manifest_id PASSED [ 38%]
tests/test_delegation_hitl.py::test_hop_pre_image_includes_scope PASSED  [ 39%]
tests/test_delegation_hitl.py::test_hop_pre_image_deterministic PASSED   [ 39%]
tests/test_delegation_hitl.py::test_hop_pre_image_different_hops PASSED  [ 40%]
tests/test_delegation_hitl.py::test_delegation_sign_verify_single_hop PASSED [ 41%]
tests/test_delegation_hitl.py::test_delegation_wrong_key_fails PASSED    [ 41%]
tests/test_delegation_hitl.py::test_delegation_wrong_length_signature_raises_clear_error PASSED [ 42%]
tests/test_delegation_hitl.py::test_delegation_truncated_signature_raises_clear_error PASSED [ 43%]
tests/test_delegation_hitl.py::test_delegation_hop_verification_goes_through_verify_bytes PASSED [ 43%]
tests/test_delegation_hitl.py::test_delegation_wrong_manifest_id_fails PASSED [ 44%]
tests/test_delegation_hitl.py::test_scope_laundering_detected PASSED     [ 45%]
tests/test_delegation_hitl.py::test_depth_exceeded_raises PASSED         [ 45%]
tests/test_delegation_hitl.py::test_empty_chain_passes PASSED            [ 46%]
tests/test_delegation_hitl.py::test_missing_public_key_raises PASSED     [ 47%]
tests/test_delegation_hitl.py::test_root_principal_must_match_manifest_issuer PASSED [ 47%]
tests/test_delegation_hitl.py::test_root_principal_matching_issuer_passes PASSED [ 48%]
tests/test_delegation_hitl.py::test_root_principal_matches_via_principal_manifest_id PASSED [ 49%]
tests/test_delegation_hitl.py::test_child_dropping_parent_constraint_is_rejected PASSED [ 50%]
tests/test_delegation_hitl.py::test_child_adding_constraint_is_allowed PASSED [ 50%]
tests/test_delegation_hitl.py::test_matching_malformed_constraints_are_unverifiable_not_valid PASSED [ 51%]
tests/test_delegation_hitl.py::test_single_hop_chain_with_constraints_is_unverifiable PASSED [ 52%]
tests/test_delegation_hitl.py::test_scope_laundering_takes_priority_over_unverifiable_constraints PASSED [ 52%]
tests/test_delegation_hitl.py::test_later_invalid_signature_is_not_masked_by_earlier_constrained_hop PASSED [ 53%]
tests/test_delegation_hitl.py::test_later_malformed_hop_is_not_masked_by_earlier_constrained_hop PASSED [ 54%]
tests/test_delegation_hitl.py::test_later_scope_laundering_is_not_masked_by_earlier_constrained_hop PASSED [ 54%]
tests/test_delegation_hitl.py::test_child_raising_ttl_is_rejected PASSED [ 55%]
tests/test_delegation_hitl.py::test_child_unbounded_ttl_under_bounded_parent_is_rejected PASSED [ 56%]
tests/test_delegation_hitl.py::test_child_raising_max_delegation_depth_is_rejected PASSED [ 56%]
tests/test_delegation_hitl.py::test_child_delegated_late_with_equal_ttl_outlives_parent_is_rejected PASSED [ 57%]
tests/test_delegation_hitl.py::test_child_delegated_late_with_shorter_ttl_still_within_parent_window_passes PASSED [ 58%]
tests/test_delegation_hitl.py::test_mixed_z_and_naive_delegated_at_still_refuses_on_absolute_expiry PASSED [ 58%]
tests/test_delegation_hitl.py::test_approval_pre_image_includes_manifest_id PASSED [ 59%]
tests/test_delegation_hitl.py::test_approval_pre_image_includes_scope PASSED [ 60%]
tests/test_delegation_hitl.py::test_approval_sign_verify PASSED          [ 60%]
tests/test_delegation_hitl.py::test_approval_wrong_key_fails PASSED      [ 61%]
tests/test_delegation_hitl.py::test_approval_wrong_manifest_id_fails PASSED [ 62%]
tests/test_delegation_hitl.py::test_approval_scope_change_fails PASSED   [ 63%]
tests/test_delegation_hitl.py::test_approval_expired_raises PASSED       [ 63%]
tests/test_delegation_hitl.py::test_expiring_approval_requires_timezone[2026-09-05T23:00:00] PASSED [ 64%]
tests/test_delegation_hitl.py::test_expiring_approval_requires_timezone[2026-09-05] PASSED [ 65%]
tests/test_delegation_hitl.py::test_expiring_approval_accepts_valid_timezone_offsets[-7] PASSED [ 65%]
tests/test_delegation_hitl.py::test_expiring_approval_accepts_valid_timezone_offsets[0] PASSED [ 66%]
tests/test_delegation_hitl.py::test_expiring_approval_accepts_valid_timezone_offsets[5.5] PASSED [ 67%]
tests/test_delegation_hitl.py::test_approval_zero_duration_raises_value_error PASSED [ 67%]
tests/test_delegation_hitl.py::test_approval_missing_duration_raises_value_error PASSED [ 68%]
tests/test_delegation_hitl.py::test_approval_negative_duration_raises_value_error PASSED [ 69%]
tests/test_delegation_hitl.py::test_approval_fractional_duration_raises_value_error PASSED [ 69%]
tests/test_delegation_hitl.py::test_approval_whole_number_float_duration_is_accepted PASSED [ 70%]
tests/test_delegation_hitl.py::test_approved_scope_rejects_numeric_string_duration PASSED [ 71%]
tests/test_delegation_hitl.py::test_approved_scope_rejects_bool_duration PASSED [ 71%]
tests/test_delegation_hitl.py::test_approved_scope_still_accepts_whole_number_float PASSED [ 72%]
tests/test_delegation_hitl.py::test_approved_scope_still_rejects_fractional_and_nonpositive PASSED [ 73%]
tests/test_delegation_hitl.py::test_non_object_approval_raises_value_error[not-an-object] PASSED [ 73%]
tests/test_delegation_hitl.py::test_non_object_approval_raises_value_error[bad_approval1] PASSED [ 74%]
tests/test_delegation_hitl.py::test_non_object_approval_raises_value_error[42] PASSED [ 75%]
tests/test_delegation_hitl.py::test_non_object_approval_raises_value_error[None] PASSED [ 76%]
tests/test_delegation_hitl.py::test_missing_required_field_raises_value_error[approved_scope] PASSED [ 76%]
tests/test_delegation_hitl.py::test_missing_required_field_raises_value_error[approved_at] PASSED [ 77%]
tests/test_delegation_hitl.py::test_missing_required_field_raises_value_error[approver_id] PASSED [ 78%]
tests/test_delegation_hitl.py::test_missing_required_field_raises_value_error[approval_signature] PASSED [ 78%]
tests/test_delegation_hitl.py::test_non_object_approved_scope_raises_value_error[a-string] PASSED [ 79%]
tests/test_delegation_hitl.py::test_non_object_approved_scope_raises_value_error[bad_scope1] PASSED [ 80%]
tests/test_delegation_hitl.py::test_non_object_approved_scope_raises_value_error[True] PASSED [ 80%]
tests/test_delegation_hitl.py::test_non_numeric_approval_duration_raises_value_error[soon] PASSED [ 81%]
tests/test_delegation_hitl.py::test_non_numeric_approval_duration_raises_value_error[] PASSED [ 82%]
tests/test_delegation_hitl.py::test_non_numeric_approval_duration_raises_value_error[bad_duration2] PASSED [ 82%]
tests/test_delegation_hitl.py::test_non_numeric_approval_duration_raises_value_error[bad_duration3] PASSED [ 83%]
tests/test_delegation_hitl.py::test_non_numeric_approval_duration_raises_value_error[bad_duration4] PASSED [ 84%]
tests/test_delegation_hitl.py::test_non_numeric_approval_duration_raises_value_error[bad_duration5] PASSED [ 84%]
tests/test_delegation_hitl.py::test_non_numeric_approval_duration_raises_value_error[True] PASSED [ 85%]
tests/test_delegation_hitl.py::test_non_numeric_approval_duration_raises_value_error[False] PASSED [ 86%]
tests/test_delegation_hitl.py::test_non_numeric_approval_duration_raises_value_error[None] PASSED [ 86%]
tests/test_delegation_hitl.py::test_oversized_approval_duration_raises_value_error PASSED [ 87%]
tests/test_delegation_hitl.py::test_non_string_approval_signature_raises_value_error[12345] PASSED [ 88%]
tests/test_delegation_hitl.py::test_non_string_approval_signature_raises_value_error[bad_sig1] PASSED [ 89%]
tests/test_delegation_hitl.py::test_non_string_approval_signature_raises_value_error[bad_sig2] PASSED [ 89%]
tests/test_delegation_hitl.py::test_malformed_base64_signature_raises_value_error PASSED [ 90%]
tests/test_delegation_hitl.py::test_illegal_char_prefixed_signature_raises_value_error_not_silently_accepted PASSED [ 91%]
tests/test_delegation_hitl.py::test_standard_alphabet_signature_raises_value_error_not_silently_accepted PASSED [ 91%]
tests/test_delegation_hitl.py::test_wrong_length_signature_raises_clear_error PASSED [ 92%]
tests/test_delegation_hitl.py::test_truncated_signature_raises_clear_error PASSED [ 93%]
tests/test_delegation_hitl.py::test_hitl_verification_goes_through_verify_bytes PASSED [ 93%]
tests/test_delegation_hitl.py::test_invalid_approver_public_key_is_not_reported_as_a_base64_error PASSED [ 94%]
tests/test_delegation_hitl.py::test_non_string_approved_at_raises_value_error PASSED [ 95%]
tests/test_delegation_hitl.py::test_non_string_approver_id_raises_value_error PASSED [ 95%]
tests/test_delegation_hitl.py::test_hitl_approval_rejects_spiffe_approver_id PASSED [ 96%]
tests/test_delegation_hitl.py::test_hitl_approval_accepts_mailto_approver_id PASSED [ 97%]
tests/test_delegation_hitl.py::test_hitl_approval_accepts_did_approver_id PASSED [ 97%]
tests/test_delegation_hitl.py::test_relabelling_approval_method_breaks_the_signature PASSED [ 98%]
tests/test_delegation_hitl.py::test_adding_an_approval_method_to_a_signed_approval_breaks_the_signature PASSED [ 99%]
tests/test_delegation_hitl.py::test_approvals_without_a_method_still_verify_unchanged PASSED [100%]

============================== warnings summary ===============================
..\..\..\venv\Lib\site-packages\_pytest\config\__init__.py:1474
  <python-prefix>\Lib\site-packages\_pytest\config\__init__.py:1474: PytestConfigWarning: Unknown config option: asyncio_mode
  
    self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======================= 146 passed, 1 warning in 0.64s ========================
