11use std:: borrow:: Cow ;
2- use std:: ffi:: CStr ;
2+ use std:: ffi:: { CStr , CString } ;
33use std:: marker:: PhantomData ;
44use std:: ops:: Index ;
55use std:: ptr:: NonNull ;
66
77use foreign_types:: { ForeignType , ForeignTypeRef } ;
8+ use zeroize:: Zeroizing ;
89
910use crate :: credentials:: { Credential , CredentialRef } ;
1011use crate :: device:: Device ;
@@ -16,17 +17,20 @@ pub struct CredentialManagement<'a> {
1617 pub ( crate ) ptr : NonNull < ffi:: fido_credman_metadata_t > ,
1718
1819 dev : & ' a Device ,
20+
21+ pin : Zeroizing < CString > ,
1922}
2023
2124impl < ' a > CredentialManagement < ' a > {
22- pub ( crate ) fn new ( device : & Device ) -> CredentialManagement {
23- unsafe {
24- let ptr = ffi:: fido_credman_metadata_new ( ) ;
25-
26- CredentialManagement {
27- ptr : NonNull :: new_unchecked ( ptr) ,
28- dev : device,
29- }
25+ pub ( crate ) fn new (
26+ ptr : NonNull < ffi:: fido_credman_metadata_t > ,
27+ device : & Device ,
28+ pin : Zeroizing < CString > ,
29+ ) -> CredentialManagement {
30+ CredentialManagement {
31+ ptr,
32+ dev : device,
33+ pin,
3034 }
3135 }
3236
@@ -41,11 +45,8 @@ impl<'a> CredentialManagement<'a> {
4145 }
4246
4347 /// Get information about relying parties with resident credentials in dev.
44- ///
45- /// A valid pin must be provided.
46- pub fn get_rp ( & self , pin : & str ) -> Result < IterRP < ' a > > {
47- let pin = std:: ffi:: CString :: new ( pin) ?;
48- let pin_ptr = pin. as_ptr ( ) ;
48+ pub fn get_rp ( & self ) -> Result < IterRP < ' a > > {
49+ let pin_ptr = self . pin . as_ptr ( ) ;
4950
5051 unsafe {
5152 let p = ffi:: fido_credman_rp_new ( ) ;
@@ -68,12 +69,9 @@ impl<'a> CredentialManagement<'a> {
6869 }
6970
7071 /// Get resident credentials belonging to rp (relying parties) in dev.
71- ///
72- /// A valid pin must be provided.
73- pub fn get_rk < ' i , I : Into < Cow < ' i , CStr > > > ( & self , rp : I , pin : & str ) -> Result < CredManRK < ' a > > {
72+ pub fn get_rk < ' i , I : Into < Cow < ' i , CStr > > > ( & self , rp : I ) -> Result < CredManRK < ' a > > {
7473 let rp = rp. into ( ) ;
75- let pin = std:: ffi:: CString :: new ( pin) ?;
76- let pin_ptr = pin. as_ptr ( ) ;
74+ let pin_ptr = self . pin . as_ptr ( ) ;
7775
7876 unsafe {
7977 let rk = ffi:: fido_credman_rk_new ( ) ;
@@ -97,9 +95,8 @@ impl<'a> CredentialManagement<'a> {
9795 ///
9896 /// # Arguments
9997 /// * `cred_id` - credential id
100- pub fn delete_rk ( & self , cred_id : & [ u8 ] , pin : & str ) -> Result < ( ) > {
101- let pin = std:: ffi:: CString :: new ( pin) ?;
102- let pin_ptr = pin. as_ptr ( ) ;
98+ pub fn delete_rk ( & self , cred_id : & [ u8 ] ) -> Result < ( ) > {
99+ let pin_ptr = self . pin . as_ptr ( ) ;
103100
104101 unsafe {
105102 check ( ffi:: fido_credman_del_dev_rk (
@@ -120,9 +117,8 @@ impl<'a> CredentialManagement<'a> {
120117 /// See [Credential::set_id] and [Credential::set_user] for details.
121118 ///
122119 /// Only a credential's user attributes (name, display name) may be updated at this time.
123- pub fn set_rk ( & self , cred : & Credential , pin : & str ) -> Result < ( ) > {
124- let pin = std:: ffi:: CString :: new ( pin) ?;
125- let pin_ptr = pin. as_ptr ( ) ;
120+ pub fn set_rk ( & self , cred : & Credential ) -> Result < ( ) > {
121+ let pin_ptr = self . pin . as_ptr ( ) ;
126122
127123 unsafe {
128124 check ( ffi:: fido_credman_set_dev_rk (
0 commit comments