skip to content

Why must an RFC 8485 `vot` vector travel with its `vtm` trustmark, and what does that trustmark point at?

level: middleimportance: should knowfreq 28%

answer

  1. the notation is defined, the values are not
  2. a string with no dictionary
  3. two claims, useless apart
  4. the URL points at prose
  5. same word, two unrelated objects

basics

~20 s

Component values are defined by a trust framework, not by RFC 8485, so a vector without its framework is unprocessable. The vtm claim carries an HTTPS URL pointing at the human-readable trust-framework document that gives each value its meaning.

solid answer

~40 s

RFC 8485 defines the *grammar* of a vector and the four component demarcators, but deliberately not the values. What `P1` or `Cc` requires is set by a published **trust framework**, so the vector must be communicated bound to a pointer at that framework: the `vot` claim carries the vector, the `vtm` claim carries the **trustmark**, an HTTPS URL resolving to the human-readable document that defines the values. A relying party that receives `vot` with no `vtm` has a syntactically valid string it cannot interpret. Note the name collision: an RFC 8485 trustmark is a URL to prose, while a Trust Mark in OpenID Federation is a signed JWT carrying `trust_mark_type`. Two unrelated objects — always say which one you mean.

code

json · 9 lines
json
{
  "vot": "P1.Cc.Ac",
  "vtm": "https://framework.example/consortium/v1"
}

{
  "vot": "P1.Cc.Ac",
  "vtm": "https://sector-body.example/assurance/2"
}

go deeper

for a junior

Recall that the vector travels in one claim and a pointer to its definitions travels in another, and that the letters mean nothing without that pointer.

for a middle

Explain why the specification leaves values to a framework, and what a relying party is holding when it receives a vector with no trustmark: a syntactically valid uninterpretable string.

for a senior

The failure to describe is a silent accept — one partner's values read under another partner's framework. Say how you guard it: an explicit table of frameworks you have read, default-deny otherwise.

for a principal

Decide how many distinct frameworks your organisation will ever agree to read and maintain. Every extra one is a document somebody must re-read whenever a partner revises it.

## What the specification defines, and what it deliberately does not **RFC 8485** gives you the notation: four component demarcators, a single value character each, joined with `.`. What it does not give you is a value dictionary. There is no universal definition of `P1`, and that is on purpose — proofing practice differs so much between a bank, a research federation and a relief consortium that a single global scale would either be useless or be ignored. The meaning therefore lives in a **trust framework**: a published document that says, for the parties who have agreed to it, what each component value requires. A vector interpreted outside its framework is not a weaker claim; it is not a claim at all. ## The two claims, and the binding between them | Claim | Carries | What the relying party does with it | |---|---|---| | `vot` | The vector itself, e.g. `P1.Cc.Ac` | Parses it into components and values | | `vtm` | An HTTPS URL — the **trustmark** | Identifies which framework defines those values | The two are useless apart. `vot` without `vtm` is a string of letters with no dictionary. `vtm` without `vot` is a dictionary with nothing to look up. This is why RFC 8485 requires the vector to be communicated bound to its trustmark, and why a relying party's parser should reject the pair as incomplete rather than guessing a default framework — guessing a framework is how a partner's weakest grade silently becomes your strongest. ## What is at the end of that URL The trustmark URL resolves to a **human-readable** definition of the framework: what proofing evidence value `1` demands, what makes a credential qualify at value `c`, what counts as an acceptable assertion presentation. It is documentation for the people writing the mapping, not a machine-parseable schema, and that matters for how you operate it: - Someone on your side has to **read** it once, per framework, and encode the result in your own policy. - The URL is best treated as an **identifier** for the framework — a stable key you match against your policy table — rather than something fetched on every login. - If a partner changes the URL, you have a new framework as far as your policy is concerned, and it needs reading again before anything is admitted under it. ## The name collision you must not walk into The word *trust mark* appears twice in federation work, meaning two unrelated things: 1. an **RFC 8485 trustmark** — the HTTPS URL described above, pointing at a prose trust-framework document, carried in `vtm`; 2. an **OpenID Federation Trust Mark** — a signed JWT carrying `trust_mark_type` and issued about an entity by a trust mark issuer. One is a link to a document that defines vocabulary; the other is a cryptographically signed statement about a party. They are not two views of one mechanism, and nothing about verifying the second tells you anything about the first. Say which one you mean, every single time — in a design review, that ambiguity costs an hour. ## In the consortium, concretely Twelve relief organisations stand up shared access in two days. Three of them already belong to an existing sector framework and assert its trustmark; two have written their own one-page framework overnight and publish it at their own URL; the rest assert nothing on most axes. Your side ends up with a short list of trustmark URLs you have read and encoded, and a default-deny for any trustmark you have not. That list, not the vector strings, is the asset. Vectors arrive and change constantly; the set of frameworks you have actually read grows slowly, and it is the thing an auditor will ask you about afterwards. ## The failure to recognise The characteristic production failure here is not a rejected login — it is an **accepted** one. A relying party that treats the vector as self-describing, or that hard-codes a single framework because the first partner used it, will happily admit a second partner's `P1` under the first partner's definition. Nothing errors, nothing logs, and the assurance policy is quietly not being enforced. The guard is mechanical: no recognised trustmark, no interpretation.

  • Should a relying party fetch the trustmark URL on every authentication?
    No. The document behind it is human-readable prose meant to be read once by whoever encodes your policy. Treat the URL as a stable identifier for the framework and match it against a table you maintain. Fetching it per login buys nothing and makes a partner's web server a dependency of your sign-in path.
  • What should happen when a `vot` arrives with a trustmark you do not recognise?
    Refuse to interpret the vector. You may still admit the subject on whatever basis you would use with no assurance claim at all, but the components must not be evaluated against another framework's definitions. An unrecognised framework is an unread framework.
  • How is an RFC 8485 trustmark different from a Trust Mark in OpenID Federation?
    Completely. The first is an HTTPS URL to a human-readable framework document, carried in `vtm`, that defines what vector values mean. The second is a signed JWT carrying `trust_mark_type`, issued about an entity to say it meets some requirement. Shared word, unrelated objects.

A grade on a certificate tells you nothing until you know which examining board set it; the trustmark names the board.

saying these in an interview costs you the question

  • Thinks RFC 8485 defines what each component value requires
  • Compares vectors from two partners without checking the trustmark
  • Calls the trustmark a signed token issued about the provider
  • Assumes a missing trustmark can default to a known framework
  • Fetches and parses the trustmark URL as machine-readable policy