1
1
#![ allow( non_snake_case) ]
2
+ use std:: ops:: Deref ;
3
+
2
4
use crate :: error:: Error ;
5
+ use crate :: man_con:: ManCon ;
3
6
use crate :: utils:: open_card;
4
7
use hex:: decode;
5
8
use jsonrpc_core:: types:: Value ;
@@ -28,8 +31,8 @@ pub struct Reader {
28
31
mynumberCardInfo : Option < MynumberCardInfo > ,
29
32
}
30
33
31
- struct Responder ( Card ) ;
32
- impl Apdu for Responder {
34
+ struct Responder < ' a > ( & ' a Card ) ;
35
+ impl < ' a > Apdu for Responder < ' a > {
33
36
type TransErr = pcsc:: Error ;
34
37
fn transmit ( & self , data : Vec < u8 > ) -> Result < Vec < u8 > , Self :: TransErr > {
35
38
let card = & self . 0 ;
@@ -39,7 +42,7 @@ impl Apdu for Responder {
39
42
Ok ( result. to_vec ( ) )
40
43
}
41
44
}
42
- impl Responder {
45
+ impl < ' a > Responder < ' a > {
43
46
fn check_mynumber_card ( & self ) -> Result < ( ) , Error > {
44
47
if self . is_mynumber_card ( ) ? {
45
48
Ok ( ( ) )
@@ -64,13 +67,20 @@ pub trait Methods {
64
67
#[ rpc( name = "computeAuthSig" ) ]
65
68
fn compute_auth_sig ( & self , name : String , pin : String , hash_hex : String )
66
69
-> Result < Value , Error > ;
70
+ #[ rpc( name = "devConnect" ) ]
71
+ fn connect ( & self , name : String ) -> Result < ( ) , Error > ;
72
+ #[ rpc( name = "devDisonnect" ) ]
73
+ fn disconnect ( & self ) -> Result < ( ) , Error > ;
74
+ #[ rpc( name = "devSendAPDU" ) ]
75
+ fn send_apdu ( & self , data : Vec < u8 > ) -> Result < Vec < u8 > , Error > ;
76
+ #[ rpc( name = "devSelectDF" ) ]
77
+ fn select_df ( & self , name : String , data : Vec < u8 > ) -> Result < ( ) , Error > ;
78
+ #[ rpc( name = "devSelectEF" ) ]
79
+ fn select_ef ( & self , name : String , data : Vec < u8 > ) -> Result < ( ) , Error > ;
67
80
}
68
81
69
- pub struct RpcImpl { }
70
- impl Default for RpcImpl {
71
- fn default ( ) -> Self {
72
- Self { }
73
- }
82
+ pub struct RpcImpl {
83
+ pub man_con : ManCon ,
74
84
}
75
85
76
86
impl Methods for RpcImpl {
@@ -90,7 +100,7 @@ impl Methods for RpcImpl {
90
100
let mut mynumber_card_info: Option < MynumberCardInfo > = None ;
91
101
let error: Option < u32 > = match card_result {
92
102
Ok ( card) => {
93
- let responder = Responder ( card) ;
103
+ let responder = Responder ( & card) ;
94
104
let is_mynumber_card = responder. is_mynumber_card ( ) . unwrap_or ( false ) ;
95
105
if is_mynumber_card {
96
106
mynumber_card_info = Some ( MynumberCardInfo {
@@ -102,7 +112,7 @@ impl Methods for RpcImpl {
102
112
. unwrap_or ( 0u8 ) ,
103
113
} )
104
114
}
105
- let _ = responder . 0 . disconnect ( Disposition :: LeaveCard ) ;
115
+ let _ = card . disconnect ( Disposition :: LeaveCard ) ;
106
116
None
107
117
}
108
118
Err ( e) => Some ( e as u32 ) ,
@@ -138,7 +148,7 @@ impl Methods for RpcImpl {
138
148
fn get_auth_cert ( & self , name : String ) -> Result < Value , Error > {
139
149
let card = open_card ( name) ?;
140
150
141
- let responder = Responder ( card) ;
151
+ let responder = Responder ( & card) ;
142
152
143
153
responder. check_mynumber_card ( ) ?;
144
154
let cert = responder. get_cert ( KeyType :: UserAuth ) ?;
@@ -147,7 +157,7 @@ impl Methods for RpcImpl {
147
157
fn get_sign_cert ( & self , name : String ) -> Result < Value , Error > {
148
158
let card = open_card ( name) ?;
149
159
150
- let responder = Responder ( card) ;
160
+ let responder = Responder ( & card) ;
151
161
152
162
responder. check_mynumber_card ( ) ?;
153
163
let cert = responder. get_cert ( KeyType :: DigitalSign ) ?;
@@ -164,12 +174,47 @@ impl Methods for RpcImpl {
164
174
}
165
175
let card = open_card ( name) ?;
166
176
167
- let responder = Responder ( card) ;
177
+ let responder = Responder ( & card) ;
168
178
169
179
responder. check_mynumber_card ( ) ?;
170
180
let cert = responder. get_cert ( KeyType :: UserAuth ) ?;
171
181
let hash = decode ( hash_hex) ?;
172
182
let sig = responder. compute_sig ( & pin, & hash[ ..] , KeyType :: UserAuth ) ?;
173
183
Ok ( json ! ( { "sig" : sig, "cert" : cert} ) )
174
184
}
185
+
186
+ fn connect ( & self , name : String ) -> Result < ( ) , Error > {
187
+ self . man_con . connect ( name) ?;
188
+ Ok ( ( ) )
189
+ }
190
+
191
+ fn disconnect ( & self ) -> Result < ( ) , Error > {
192
+ self . man_con . disconnect ( ) ?;
193
+ Ok ( ( ) )
194
+ }
195
+
196
+ fn send_apdu ( & self , data : Vec < u8 > ) -> Result < Vec < u8 > , Error > {
197
+ let got_card = self . man_con . get_card ( ) ;
198
+ let read_card = got_card. read ( ) ;
199
+ let unwrap_card = read_card. unwrap ( ) ;
200
+ let deref_card = unwrap_card. deref ( ) . as_ref ( ) ;
201
+ let card2 = deref_card. unwrap ( ) ;
202
+ let responder = Responder ( card2) ;
203
+ let res = responder. transmit ( data) ?;
204
+ Ok ( res)
205
+ }
206
+
207
+ fn select_df ( & self , name : String , data : Vec < u8 > ) -> Result < ( ) , Error > {
208
+ let card = open_card ( name) ?;
209
+ let responder = Responder ( & card) ;
210
+ responder. select_df ( & data) ?;
211
+ Ok ( ( ) )
212
+ }
213
+
214
+ fn select_ef ( & self , name : String , data : Vec < u8 > ) -> Result < ( ) , Error > {
215
+ let card = open_card ( name) ?;
216
+ let responder = Responder ( & card) ;
217
+ responder. select_ef ( & data) ?;
218
+ Ok ( ( ) )
219
+ }
175
220
}
0 commit comments