Skip to content

Add "Credential Manager Trust Group (CMTG) Key" extension#2377

Open
timcappalli wants to merge 14 commits intomainfrom
2338-cmtg
Open

Add "Credential Manager Trust Group (CMTG) Key" extension#2377
timcappalli wants to merge 14 commits intomainfrom
2338-cmtg

Conversation

@timcappalli
Copy link
Member

@timcappalli timcappalli commented Jan 8, 2026

Closes #2338

The following tasks have been completed:

  • Modified Web platform tests (link)

Implementation commitment:

Documentation and checks

  • Affects privacy
  • Affects security
  • Updated explainer (link)

Preview | Diff

@timcappalli timcappalli marked this pull request as ready for review January 26, 2026 18:59
@nsatragno nsatragno self-requested a review February 2, 2026 21:05
Copy link
Member

@nsatragno nsatragno left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you so much for doing this work! Here's a first pass at a review.

: <dfn>Credential Manager Trust Group Key</dfn>
: <dfn>Credential Manager Trust Group Private Key</dfn>
: <dfn>Credential Manager Trust Group Public Key</dfn>
:: A [=Credential Manager Trust Group Key=], is a [=authenticator=]- / [=credential manager=]-, [=[RP]=]-, and [=user credential=]-specific
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: having "/[=credential manager=]" everywhere is awkward. Do we really need to introduce this term to the spec? I'd say drop the "credential manager". It's cleaner.

index.bs Outdated

This [=authenticator extension|authenticator=] [=registration extension=] and [=authentication extension=]
enables an [=authenticator=]/[=credential manager=] to provide a signal to a [=[RP]=]
that two devices possessing the same [=backup eligible=] credential
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
that two devices possessing the same [=backup eligible=] credential
that two devices possessing the same [=backed up=] credential

is slightly more precise, since by definition the credential must have been backed up for it to share the CMTG key.

index.bs Outdated
have established a trust relationship through a non-remote interaction,
such as a local setup or physical proximity.

This is done by creating an additional [=public key credential source=]-specific key pair
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This is done by creating an additional [=public key credential source=]-specific key pair
This is done by creating an additional [=public key credential source=]-specific [=Credential Manager Trust Group key pair=]

index.bs Outdated
This is done by creating an additional [=public key credential source=]-specific key pair
in the authenticator/credential manager, if such a key pair does not already exist for
the [=public key credential source=] being created or exercised,
and returning the [=Credential Manager Trust Group public key=]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At a given time, more than one CMTG may be valid for a credential on a device.

Suggested change
and returning the [=Credential Manager Trust Group public key=]
and returning one of the [=Credential Manager Trust Group public keys=]

(i.e. `authData` and `hash`) by the [=Credential Manager Trust Group public key=] |cmtgKey|.
(The signature algorithm is the same as for the [=user credential=].)

1. If the [=[RP]=]'s [=user account=] mapped to the <code>|credential|.{{Credential/id}}</code> in play (i.e., for the user being authenticated)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should refer to the credential record object here as well.

(The signature algorithm is the same as for the [=user credential=].)

1. Complete the steps from [[#sctn-registering-a-new-credential]] and, if those steps are successful,
store the |cmtgKey| value indexed to the <code>|credential|.{{Credential/id}}</code> in the [=user account=].
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should refer to the credential record object here instead.

In fact, the credential record object should be updated to add CMTG public keys.

1. If the [=[RP]=]'s [=user account=] mapped to the <code>|credential|.{{Credential/id}}</code> in play (i.e., for the user being authenticated)
hold a `cmtgKey` value corresponding to the extracted |attObjForCmtgKey| fields,
then perform binary equality checks between the corresponding stored value and the extracted field value.
The [=[RP]=] MAY have more than one `cmtgKey` value mapped to the [=user account=] and <code>|credential|.{{Credential/id}}</code> pair
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of this note why not make L7937 a loop per stored CMTG key.

1. Store the extracted |cmtgKey| value indexed to the <code>|credential|.{{Credential/id}}</code> in the [=user account=].
Terminate these verification steps.

See also [[#sctn-cmtg-key-extension-usage]].
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to add virtual authenticator support for this feature? It feels it should be pretty simple, and it'll be required to write WPTs.

Comment on lines +7869 to +7870
1. If a [=Credential Manager Trust Group Key=] does not already exist for this {[=public key credential source/id|Credential ID=],
[=public key credential source/rpId|RP ID=], [=public key credential source/rpId|userHandle=]} tuple in the [=authenticator=]/[=credential manager=],
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As written, CMTG keys seem to have a 1:1 relationship with public key credentials. Even if we don't define the mechanism that determines which devices belong to a trust group, we should incorporate the concept of trust groups to the execution steps:

  1. If a [=Credential Manager Trust Group Key=] does not already exist for this [=public key credential source=] and [=credential manager trust group=] tuple,

We should have a definition for "credential manager trust group" as well.

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.

Add Credential Manager Trust Group Key (CMTG) extension

2 participants