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.1.0.tar.gz (25.2 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.1.0-py3-none-any.whl (11.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: sm_authority-0.1.0.tar.gz
  • Upload date:
  • Size: 25.2 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.1.0.tar.gz
Algorithm Hash digest
SHA256 f1b6f98380c9de9caea536972c228e22c6cdd66baffcbb4f155bd6d40172e144
MD5 c6dfe01ae5b8887baab3d0574b2b13ec
BLAKE2b-256 16e1022fffc174f616bfcff30ce328be7a92492f54b826ee877e0465b05605f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for sm_authority-0.1.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.1.0-py3-none-any.whl.

File metadata

  • Download URL: sm_authority-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 11.9 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2df37c7102b0f1fd505ec73e5e44dd277bd106cd418e1c5fad30d68c08acdcb2
MD5 a75fd8bfd61a43bc7275b6430207ade5
BLAKE2b-256 9194664cb1d51b9b25aeb850d8e5eb9b6d684a7cdda8922e6df3333850225486

See more details on using hashes here.

Provenance

The following attestation bundles were made for sm_authority-0.1.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

0.2.0

2 files

This release

0.1.0 This release

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