Skip to main content

sm-authority — the Common Authority Evidence envelope

Establishes the one thing a delegated grant can't prove about itself: that its grantor_did (and the human-readable subject locator) is controlled by the real owner. That is sm-dat SPEC O1 — stated there as a precondition the grant verifier cannot check and must be given out of band. This is the out-of-band mechanism, in one interoperable form across every source of authority an actor might have — including actors with no DNS and no registry account.

One envelope binds a subject locator → durable anchor → grantor_did, justified by evidence blocks (oidc, platform_install, domain_control, did_control, civic, prior_binding_key), each checked by an injected per-type verifier and aggregated into a three-valued verdict (VERIFIED / REFUTED / INDETERMINATE). A VERIFIED result is the locator↔anchor record a registry checks a binding grant against.

from sm_authority import (Identity, build_anchor, build_evidence, build_authority_evidence,
                          sign_authority_evidence, sign_binding_challenge,
                          verify_authority_evidence, covers, PriorBindingKeyVerifier,
                          PRIOR_BINDING_KEY)

issuer, owner, recovery = Identity.generate(), Identity.generate(), Identity.generate()

env = sign_authority_evidence(issuer, build_authority_evidence(
    subject="john@hotmail.com",
    anchor=build_anchor(method="oidc", issuer="https://login.microsoftonline.com", anchor_id="<oid>"),
    grantor_did=owner.did,
    evidence=[build_evidence(PRIOR_BINDING_KEY, prior_did=recovery.did, challenge="c1",
                             signature=sign_binding_challenge(recovery, subject="john@hotmail.com",
                                                              grantor_did=owner.did, challenge="c1"))],
    issued_at="2026-07-28T12:00:00Z", not_after="2027-01-01T00:00:00Z",
))

verifiers = {PRIOR_BINDING_KEY: PriorBindingKeyVerifier(trusted_prior_dids={recovery.did})}
v = verify_authority_evidence(env, verifiers, "2026-07-29T12:00:00Z")
assert v.status == "VERIFIED"
assert covers(v.binding, grantor_did=owner.did, subject="john@hotmail.com")   # O1 discharged

Two decisions that define this library

  • Locator ≠ anchor. The subject is a discoverable label; the anchor is the issuer-controlled immutable id you actually trust (emails are mutable and reusable). The verified binding records the relationship — it does not treat the locator as the authority.
  • A refutation always wins. One REFUTED evidence block poisons the whole envelope; an unverifiable extra block never demotes a solid verification. You need enough positive proof, and any disproof kills it — fail-closed, like the rest of the stack.

Injected, not assumed

The framework does no crypto and trusts no provider. Real JWT/JWKS verification and platform/domain checks are injected verifiers — the package ships the framework plus two references: the fully-offline prior_binding_key (Ed25519 recovery-key attestation) and OIDCVerifier (the anchor-binding check, with the token validator injected). No insecure default: an unsupported evidence type is INDETERMINATE, never ignored.

Status

  • SPEC.md — normative draft (authority/0.1-draft); §6 shows how a registry discharges O1 before honouring a binding grant.
  • vectors/authority/0.1/ — deterministic conformance corpus; regenerate with python vectors/_generate.py, replay with pytest.
  • Depends only on sm-arp (identity, canonicalization, signatures). No transport, no framework.

License

MIT © 2026 StellarMinds. See LICENSE.


Part of the NANDA ecosystem · built by StellarMinds.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sm_authority-0.2.0.tar.gz (26.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sm_authority-0.2.0-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file sm_authority-0.2.0.tar.gz.

File metadata

  • Download URL: sm_authority-0.2.0.tar.gz
  • Upload date:
  • Size: 26.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sm_authority-0.2.0.tar.gz
Algorithm Hash digest
SHA256 64173c1e3a07b1e485b25828d9f6dc8cb255572a84964a509eff948be7eae06f
MD5 aced759f5f78a198e7036fb497b02b25
BLAKE2b-256 9baea379de71486f6ff4bf1f025bce4d4d0ff8cb06e801561c6a7ae091bc7192

See more details on using hashes here.

Provenance

The following attestation bundles were made for sm_authority-0.2.0.tar.gz:

Publisher: release.yml on Sharathvc23/sm-authority

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sm_authority-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: sm_authority-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sm_authority-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a80ef1303464a0f0db6d5c8bcdce7334e7acb11019996580c020a1a4b2411f88
MD5 884405a706be590b41217a2c541efd56
BLAKE2b-256 3e3fba2c543692e515c6b149e03401d447e6f81bb28b7d2dc67ab35ebca6200f

See more details on using hashes here.

Provenance

The following attestation bundles were made for sm_authority-0.2.0-py3-none-any.whl:

Publisher: release.yml on Sharathvc23/sm-authority

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page