11use serde_cbor:: ser:: to_vec;
22use std:: time:: Duration ;
3+ use tracing:: info;
34
45use crate :: pin:: { PinProvider , PinUvAuthProtocol } ;
56use crate :: proto:: ctap2:: Ctap2AuthenticatorConfigCommand ;
67pub use crate :: transport:: error:: { CtapError , Error , TransportError } ;
78use crate :: transport:: Channel ;
8- use crate :: webauthn:: user_verification;
9+ use crate :: webauthn:: handle_errors;
10+ use crate :: webauthn:: { user_verification, UsedPinUvAuthToken } ;
911use crate :: {
1012 ops:: webauthn:: UserVerificationRequirement ,
1113 proto:: ctap2:: {
12- ClientPinRequestPermissions , Ctap2 , Ctap2AuthenticatorConfigRequest ,
14+ Ctap2 , Ctap2AuthTokenPermissionRole , Ctap2AuthenticatorConfigRequest ,
1315 Ctap2UserVerifiableRequest ,
1416 } ,
1517} ;
@@ -64,17 +66,22 @@ where
6466 ) -> Result < ( ) , Error > {
6567 let mut req = Ctap2AuthenticatorConfigRequest :: new_toggle_always_uv ( ) ;
6668
67- user_verification (
68- self ,
69- UserVerificationRequirement :: Required ,
70- & mut req,
71- pin_provider,
72- timeout,
73- )
74- . await ?;
75-
76- // On success, this is an all-empty Ctap2ClientPinResponse
77- self . ctap2_authenticator_config ( & req, timeout) . await
69+ loop {
70+ let uv_auth_used = user_verification (
71+ self ,
72+ UserVerificationRequirement :: Required ,
73+ & mut req,
74+ pin_provider,
75+ timeout,
76+ )
77+ . await ?;
78+ // On success, this is an all-empty Ctap2AuthenticatorConfigResponse
79+ handle_errors ! (
80+ self ,
81+ self . ctap2_authenticator_config( & req, timeout) . await ,
82+ uv_auth_used
83+ )
84+ }
7885 }
7986
8087 async fn enable_enterprise_attestation (
@@ -84,17 +91,22 @@ where
8491 ) -> Result < ( ) , Error > {
8592 let mut req = Ctap2AuthenticatorConfigRequest :: new_enable_enterprise_attestation ( ) ;
8693
87- user_verification (
88- self ,
89- UserVerificationRequirement :: Required ,
90- & mut req,
91- pin_provider,
92- timeout,
93- )
94- . await ?;
95-
96- // On success, this is an all-empty Ctap2ClientPinResponse
97- self . ctap2_authenticator_config ( & req, timeout) . await
94+ loop {
95+ let uv_auth_used = user_verification (
96+ self ,
97+ UserVerificationRequirement :: Required ,
98+ & mut req,
99+ pin_provider,
100+ timeout,
101+ )
102+ . await ?;
103+ // On success, this is an all-empty Ctap2AuthenticatorConfigResponse
104+ handle_errors ! (
105+ self ,
106+ self . ctap2_authenticator_config( & req, timeout) . await ,
107+ uv_auth_used
108+ )
109+ }
98110 }
99111
100112 async fn set_min_pin_length (
@@ -105,17 +117,22 @@ where
105117 ) -> Result < ( ) , Error > {
106118 let mut req = Ctap2AuthenticatorConfigRequest :: new_set_min_pin_length ( new_pin_length) ;
107119
108- user_verification (
109- self ,
110- UserVerificationRequirement :: Required ,
111- & mut req,
112- pin_provider,
113- timeout,
114- )
115- . await ?;
116-
117- // On success, this is an all-empty Ctap2ClientPinResponse
118- self . ctap2_authenticator_config ( & req, timeout) . await
120+ loop {
121+ let uv_auth_used = user_verification (
122+ self ,
123+ UserVerificationRequirement :: Required ,
124+ & mut req,
125+ pin_provider,
126+ timeout,
127+ )
128+ . await ?;
129+ // On success, this is an all-empty Ctap2AuthenticatorConfigResponse
130+ handle_errors ! (
131+ self ,
132+ self . ctap2_authenticator_config( & req, timeout) . await ,
133+ uv_auth_used
134+ )
135+ }
119136 }
120137
121138 async fn force_change_pin (
@@ -126,17 +143,22 @@ where
126143 ) -> Result < ( ) , Error > {
127144 let mut req = Ctap2AuthenticatorConfigRequest :: new_force_change_pin ( force) ;
128145
129- user_verification (
130- self ,
131- UserVerificationRequirement :: Required ,
132- & mut req,
133- pin_provider,
134- timeout,
135- )
136- . await ?;
137-
138- // On success, this is an all-empty Ctap2ClientPinResponse
139- self . ctap2_authenticator_config ( & req, timeout) . await
146+ loop {
147+ let uv_auth_used = user_verification (
148+ self ,
149+ UserVerificationRequirement :: Required ,
150+ & mut req,
151+ pin_provider,
152+ timeout,
153+ )
154+ . await ?;
155+ // On success, this is an all-empty Ctap2AuthenticatorConfigResponse
156+ handle_errors ! (
157+ self ,
158+ self . ctap2_authenticator_config( & req, timeout) . await ,
159+ uv_auth_used
160+ )
161+ }
140162 }
141163
142164 async fn set_min_pin_length_rpids (
@@ -146,18 +168,22 @@ where
146168 timeout : Duration ,
147169 ) -> Result < ( ) , Error > {
148170 let mut req = Ctap2AuthenticatorConfigRequest :: new_set_min_pin_length_rpids ( rpids) ;
149-
150- user_verification (
151- self ,
152- UserVerificationRequirement :: Required ,
153- & mut req,
154- pin_provider,
155- timeout,
156- )
157- . await ?;
158-
159- // On success, this is an all-empty Ctap2ClientPinResponse
160- self . ctap2_authenticator_config ( & req, timeout) . await
171+ loop {
172+ let uv_auth_used = user_verification (
173+ self ,
174+ UserVerificationRequirement :: Required ,
175+ & mut req,
176+ pin_provider,
177+ timeout,
178+ )
179+ . await ?;
180+ // On success, this is an all-empty Ctap2AuthenticatorConfigResponse
181+ handle_errors ! (
182+ self ,
183+ self . ctap2_authenticator_config( & req, timeout) . await ,
184+ uv_auth_used
185+ )
186+ }
161187 }
162188}
163189
@@ -188,8 +214,8 @@ impl Ctap2UserVerifiableRequest for Ctap2AuthenticatorConfigRequest {
188214 unreachable ! ( )
189215 }
190216
191- fn permissions ( & self ) -> ClientPinRequestPermissions {
192- return ClientPinRequestPermissions :: AUTHENTICATOR_CONFIGURATION ;
217+ fn permissions ( & self ) -> Ctap2AuthTokenPermissionRole {
218+ return Ctap2AuthTokenPermissionRole :: AUTHENTICATOR_CONFIGURATION ;
193219 }
194220
195221 fn permissions_rpid ( & self ) -> Option < & str > {
0 commit comments