Skip to content

signing: derive request profile from the negotiated AdCP version #1037

Description

@bokelley

Problem

SDK 8.0.0b2 changes the request-signing default to the strict AdCP 3.2 profile, but the high-level client does not derive that profile from its configured/negotiated AdCP version.

ADCPClient(adcp_version="3.1", signing=SigningConfig(...)) injects adcp_version="3.1" into requests while SigningConfig.signing_profile_version independently defaults to "3.2". _sign_outgoing_request() passes that value directly to sign_request().

The resulting request claims 3.1 but uses 3.2 Structured Fields binary encoding. A strict 3.1 peer expects the legacy Base64URL representation and may reject it.

Reproduction

client = ADCPClient(
    config,
    adcp_version="3.1",
    signing=SigningConfig(private_key=key, key_id="buyer-key"),
)

assert client.get_adcp_version() == "3.1"
assert client.signing.signing_profile_version == "3.2"

The migration guide currently tells adopters to override signing_profile_version="3.1" manually. That is easy to miss and makes the high-level client's version pin internally inconsistent.

Proposed behavior

  • Make the high-level signing profile default derive from the client's trusted configured/negotiated AdCP version.
  • Preserve an explicit SigningConfig(signing_profile_version=...) override for endpoints whose trusted deployment configuration requires it.
  • Apply per-agent pins in ADCPMultiAgentClient, including mixed 3.1/3.2 fleets.
  • Never select a verification profile from an unsigned request-body field; trusted endpoint configuration and negotiated capabilities remain authoritative.
  • For low-level sign_request() / async_sign_request(), either require an explicit signing_profile_version or make the newest-profile default unmistakable in API docs and warnings. Requiring it in SDK 8 is preferable because the low-level function has no negotiation context.

Acceptance tests

  • A 3.1-pinned ADCPClient signs with the 3.1 binary encoding when no profile override is supplied.
  • A 3.2-pinned client signs with standard padded Base64.
  • Explicit overrides win and are documented as advanced/trusted configuration.
  • A heterogeneous multi-agent client signs each endpoint using its own pin.
  • Low-level signer behavior is explicit and covered by both 3.1 and 3.2 conformance vectors.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions