@@ -9,7 +9,7 @@ use libwebauthn::ops::webauthn::{
99 Assertion , CredentialProtectionExtension , GetAssertionHmacOrPrfInput ,
1010 GetAssertionLargeBlobExtension , GetAssertionRequest , GetAssertionRequestExtensions ,
1111 MakeCredentialHmacOrPrfInput , MakeCredentialRequest , MakeCredentialResponse ,
12- MakeCredentialsRequestExtensions , UserVerificationRequirement ,
12+ MakeCredentialsRequestExtensions , ResidentKeyRequirement , UserVerificationRequirement ,
1313} ;
1414use libwebauthn:: proto:: ctap2:: {
1515 Ctap2PublicKeyCredentialDescriptor , Ctap2PublicKeyCredentialRpEntity ,
@@ -351,30 +351,34 @@ impl CreateCredentialRequest {
351351 let other_options =
352352 serde_json:: from_str :: < webauthn:: MakeCredentialOptions > ( & request_value. to_string ( ) )
353353 . map_err ( |_| webauthn:: Error :: Internal ( "Invalid request JSON" . to_string ( ) ) ) ?;
354- let ( require_resident_key, user_verification) = if let Some ( authenticator_selection) =
355- other_options. authenticator_selection
356- {
357- let is_authenticator_storage_capable = true ;
358- let require_resident_key = authenticator_selection
359- . resident_key
360- . map ( |r| r == "required" || ( r == "preferred" && is_authenticator_storage_capable) )
361- . or ( authenticator_selection. require_resident_key ) // fallback to authenticator_selection.require_resident_key == true for WebAuthn Level 1
362- . unwrap_or_default ( ) ;
363-
364- let user_verification = authenticator_selection
365- . user_verification
366- . map ( |uv| match uv. as_ref ( ) {
367- "required" => UserVerificationRequirement :: Required ,
368- "preferred" => UserVerificationRequirement :: Preferred ,
369- "discouraged" => UserVerificationRequirement :: Discouraged ,
370- _ => todo ! ( "This should be fixed in the future" ) ,
371- } )
372- . unwrap_or ( UserVerificationRequirement :: Preferred ) ;
373-
374- ( require_resident_key, user_verification)
375- } else {
376- ( false , UserVerificationRequirement :: Preferred )
377- } ;
354+ let ( resident_key, user_verification) =
355+ if let Some ( authenticator_selection) = other_options. authenticator_selection {
356+ let resident_key = match authenticator_selection. resident_key . as_deref ( ) {
357+ Some ( "required" ) => Some ( ResidentKeyRequirement :: Required ) ,
358+ Some ( "preferred" ) => Some ( ResidentKeyRequirement :: Preferred ) ,
359+ Some ( "discouraged" ) => Some ( ResidentKeyRequirement :: Discouraged ) ,
360+ Some ( _) => None ,
361+ // legacy webauthn-1 member
362+ None if authenticator_selection. require_resident_key == Some ( true ) => {
363+ Some ( ResidentKeyRequirement :: Required )
364+ }
365+ None => None ,
366+ } ;
367+
368+ let user_verification = authenticator_selection
369+ . user_verification
370+ . map ( |uv| match uv. as_ref ( ) {
371+ "required" => UserVerificationRequirement :: Required ,
372+ "preferred" => UserVerificationRequirement :: Preferred ,
373+ "discouraged" => UserVerificationRequirement :: Discouraged ,
374+ _ => todo ! ( "This should be fixed in the future" ) ,
375+ } )
376+ . unwrap_or ( UserVerificationRequirement :: Preferred ) ;
377+
378+ ( resident_key, user_verification)
379+ } else {
380+ ( None , UserVerificationRequirement :: Preferred )
381+ } ;
378382 let extensions = if let Some ( incoming_extensions) = other_options. extensions {
379383 let extensions = MakeCredentialsRequestExtensions {
380384 cred_props : incoming_extensions. cred_props ,
@@ -465,7 +469,7 @@ impl CreateCredentialRequest {
465469
466470 relying_party : rp,
467471 user,
468- require_resident_key ,
472+ resident_key ,
469473 user_verification,
470474 algorithms,
471475 exclude,
0 commit comments