diff --git a/common/client_types.proto b/common/client_types.proto index e758464..a1ae8c5 100644 --- a/common/client_types.proto +++ b/common/client_types.proto @@ -206,6 +206,7 @@ enum MfaMethod { OIDC = 2; BIOMETRIC = 3; MOBILE_APPROVE = 4; + FIDO2 = 5; } // Multi-step MFA (added for 2.2) @@ -295,7 +296,13 @@ message ClientMfaStepStartResponse { // callbacks can be matched against the attempt that is actually current. string step_attempt_id = 1; // Biometric or mobile-approve challenge, when the method needs one. + // [2.2] For FIDO2 this holds the challenge the key has to sign. optional string challenge = 2; + // [2.2] For FIDO2: the credentials registered for this user, base64url as + // webauthn-rs serializes them. The client offers the whole list to the key, + // which answers for the one it holds, and names it in the finish request so + // later attempts can be narrowed to that credential. + repeated string credential_ids = 3; } message ClientMfaStartRequest { @@ -330,17 +337,28 @@ message ClientMfaStartResponse { // [2.2] Per-step rejections, sparse - only failing steps appear. Non-empty // means the plan was refused and no session was created. repeated MfaStepRejection rejections = 3; + // [2.2] For FIDO2 on the legacy fused path: the credentials registered for + // this user, alongside the challenge above. + repeated string credential_ids = 4; } message ClientMfaFinishRequest { string token = 1; + // [2.2] For FIDO2 this holds the hash of RP ID. optional string code = 2; + // [2.2] For FIDO2 this holds the signature. optional string auth_pub_key = 3; // [2.2] The attempt id minted by StepStart for the step being submitted. It binds // this proof to a specific attempt, so a stale or duplicate proof cannot advance // the step twice. Optional so pre-2.2 clients that omit it still parse; a None // value keeps the legacy single-step path working. optional string step_attempt_id = 4; + // [2.2] FIDO2 + optional bytes auth_data = 5; + // [2.2] For FIDO2: which credential actually signed, base64url. Picked by the + // key out of the list it was offered, so Core knows which of the user's + // security keys is in use. + optional string credential_id = 6; } message ClientMfaFinishResponse {