Skip to content

feat(join): build the subject-linkage proof to join under a fresh DID (#1b)#131

Merged
stormer78 merged 1 commit into
mainfrom
vic-linkage
Jun 17, 2026
Merged

feat(join): build the subject-linkage proof to join under a fresh DID (#1b)#131
stormer78 merged 1 commit into
mainfrom
vic-linkage

Conversation

@stormer78

Copy link
Copy Markdown
Contributor

Summary

Completes the dual-control / fresh-DID join path (#1b). When the presenting persona differs from the loaded invitation's subject, OpenVTC builds a subject-linkage proof — the invited persona authorizes the presenter — so the VTC admits the fresh DID while honoring an invite bound to another DID. The VTC verify side merged in verifiable-trust-infrastructure #526.

What's included

  • openvtc-core sign_subject_linkage — signs TAG‖vic_id‖presenter via the TDK Ed25519 routine (affinidi_tdk::affinidi_crypto::jose::signing::sign), not a hand-rolled signer. Unit-tested (round-trips against the TDK verify routine; wrong presenter fails).
  • Config::build_subject_linkage — resolves the subject persona's signing key (BIP32-derived / imported / VTA-managed) + its assertionMethod verification method and produces the proof.
  • Join flow — a loaded invitation bound to one of our personas opens the identity choice with that persona pre-selected: Enter joins as the invited identity (#1a, no linkage); choosing a different / fresh identity builds the linkage proof (#1b). Best-effort — if the subject's key isn't held locally, no proof is sent and the VTC refuses the mismatched binding.

Notes

This is the last open item from the VIC follow-ups. It's a privacy-niche path (the default presents the invited persona); the linkage trades the per-community unlinkability of a fresh DID for honoring an invite to your main identity.

Tests

openvtc-core join suite green; binary builds against tdk 0.8 / vta-sdk 0.17; fmt clean.

🤖 Generated with Claude Code

@stormer78 stormer78 requested a review from a team as a code owner June 17, 2026 13:12
… (#1b)

Completes the dual-control / fresh-DID join path. When the presenting persona
differs from the loaded invitation's subject, OpenVTC now builds a subject-
linkage proof — the invited persona authorizes the presenter — so the VTC
admits the fresh DID while honoring an invite bound to another.

- openvtc-core: `sign_subject_linkage` signs `TAG‖vic_id‖presenter` via the TDK
  Ed25519 routine (affinidi_crypto::jose::signing), not a hand-rolled signer.
- Config::build_subject_linkage resolves the subject persona's signing key
  (BIP32 / imported / VTA-managed) + its assertionMethod VM and produces the
  proof.
- Join flow: a loaded invitation bound to one of our personas now opens the
  identity choice with that persona pre-selected — Enter joins as the invited
  identity (#1a, no linkage); choosing a different identity builds the linkage
  proof (#1b). Best-effort: if the subject's key isn't held, no proof is sent
  and the VTC refuses the mismatched binding.

Tests: sign_subject_linkage round-trips against the TDK verify routine; join
helper suite green; binary builds against tdk 0.8 / vta-sdk 0.17.

Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
@stormer78 stormer78 merged commit edc6516 into main Jun 17, 2026
7 of 13 checks passed
@stormer78 stormer78 deleted the vic-linkage branch June 17, 2026 13:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant