Skip to content

Commit c074e3c

Browse files
authored
Merge pull request #2 from appare45/mynumber-dev
2 parents eb793a5 + be2f8b6 commit c074e3c

File tree

3 files changed

+108
-14
lines changed

3 files changed

+108
-14
lines changed

src/main.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ use jsonrpc_http_server::jsonrpc_core::*;
44
use jsonrpc_http_server::ServerBuilder;
55

66
mod error;
7+
mod man_con;
78
mod methods;
89
mod utils;
910
use methods::{Methods, RpcImpl};
11+
12+
use crate::man_con::ManCon;
1013
fn main() {
1114
// command line option parse phase
1215
let args: Vec<String> = std::env::args().collect();
@@ -67,7 +70,8 @@ fn main() {
6770

6871
fn run_server(listen_addr: std::net::SocketAddr) {
6972
let mut io = IoHandler::default();
70-
let rpc: RpcImpl = Default::default();
73+
let man_con: ManCon = Default::default();
74+
let rpc: RpcImpl = RpcImpl { man_con: man_con };
7175
io.extend_with(rpc.to_delegate());
7276

7377
let server = ServerBuilder::new(io)

src/man_con.rs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use pcsc::{Card, Error as PcscError};
2+
use std::{
3+
mem,
4+
ops::DerefMut,
5+
sync::RwLock,
6+
};
7+
8+
use crate::{error::Error, utils::open_card};
9+
pub struct ManCon {
10+
card: RwLock<Option<Card>>,
11+
}
12+
13+
impl Default for ManCon {
14+
fn default() -> Self {
15+
ManCon {
16+
card: Default::default(),
17+
}
18+
}
19+
}
20+
21+
impl ManCon {
22+
pub fn connect(&self, name: String) -> Result<(), PcscError> {
23+
let card = open_card(name)?;
24+
let ptr = self.card.write();
25+
let mut wraped_ptr = ptr.unwrap();
26+
let mut_ptr = wraped_ptr.deref_mut();
27+
*mut_ptr = Some(card);
28+
Ok(())
29+
}
30+
pub fn disconnect(&self) -> Result<(), Error> {
31+
let ptr = self.card.write();
32+
let mut wrapped_ptr = ptr.unwrap();
33+
let mut_ptr = wrapped_ptr.deref_mut();
34+
let unwrapped_mut_ptr = mem::replace(mut_ptr, None);
35+
unwrapped_mut_ptr
36+
.unwrap()
37+
.disconnect(pcsc::Disposition::ResetCard)
38+
.map_err(|_| (Error::Execution("Unable to drop")))?;
39+
40+
Ok(())
41+
}
42+
pub fn get_card(&self) -> &RwLock<Option<Card>> {
43+
return &self.card;
44+
}
45+
}

src/methods.rs

+58-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#![allow(non_snake_case)]
2+
use std::ops::Deref;
3+
24
use crate::error::Error;
5+
use crate::man_con::ManCon;
36
use crate::utils::open_card;
47
use hex::decode;
58
use jsonrpc_core::types::Value;
@@ -28,8 +31,8 @@ pub struct Reader {
2831
mynumberCardInfo: Option<MynumberCardInfo>,
2932
}
3033

31-
struct Responder(Card);
32-
impl Apdu for Responder {
34+
struct Responder<'a>(&'a Card);
35+
impl<'a> Apdu for Responder<'a> {
3336
type TransErr = pcsc::Error;
3437
fn transmit(&self, data: Vec<u8>) -> Result<Vec<u8>, Self::TransErr> {
3538
let card = &self.0;
@@ -39,7 +42,7 @@ impl Apdu for Responder {
3942
Ok(result.to_vec())
4043
}
4144
}
42-
impl Responder {
45+
impl<'a> Responder<'a> {
4346
fn check_mynumber_card(&self) -> Result<(), Error> {
4447
if self.is_mynumber_card()? {
4548
Ok(())
@@ -64,13 +67,20 @@ pub trait Methods {
6467
#[rpc(name = "computeAuthSig")]
6568
fn compute_auth_sig(&self, name: String, pin: String, hash_hex: String)
6669
-> 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>;
6780
}
6881

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,
7484
}
7585

7686
impl Methods for RpcImpl {
@@ -90,7 +100,7 @@ impl Methods for RpcImpl {
90100
let mut mynumber_card_info: Option<MynumberCardInfo> = None;
91101
let error: Option<u32> = match card_result {
92102
Ok(card) => {
93-
let responder = Responder(card);
103+
let responder = Responder(&card);
94104
let is_mynumber_card = responder.is_mynumber_card().unwrap_or(false);
95105
if is_mynumber_card {
96106
mynumber_card_info = Some(MynumberCardInfo {
@@ -102,7 +112,7 @@ impl Methods for RpcImpl {
102112
.unwrap_or(0u8),
103113
})
104114
}
105-
let _ = responder.0.disconnect(Disposition::LeaveCard);
115+
let _ = card.disconnect(Disposition::LeaveCard);
106116
None
107117
}
108118
Err(e) => Some(e as u32),
@@ -138,7 +148,7 @@ impl Methods for RpcImpl {
138148
fn get_auth_cert(&self, name: String) -> Result<Value, Error> {
139149
let card = open_card(name)?;
140150

141-
let responder = Responder(card);
151+
let responder = Responder(&card);
142152

143153
responder.check_mynumber_card()?;
144154
let cert = responder.get_cert(KeyType::UserAuth)?;
@@ -147,7 +157,7 @@ impl Methods for RpcImpl {
147157
fn get_sign_cert(&self, name: String) -> Result<Value, Error> {
148158
let card = open_card(name)?;
149159

150-
let responder = Responder(card);
160+
let responder = Responder(&card);
151161

152162
responder.check_mynumber_card()?;
153163
let cert = responder.get_cert(KeyType::DigitalSign)?;
@@ -164,12 +174,47 @@ impl Methods for RpcImpl {
164174
}
165175
let card = open_card(name)?;
166176

167-
let responder = Responder(card);
177+
let responder = Responder(&card);
168178

169179
responder.check_mynumber_card()?;
170180
let cert = responder.get_cert(KeyType::UserAuth)?;
171181
let hash = decode(hash_hex)?;
172182
let sig = responder.compute_sig(&pin, &hash[..], KeyType::UserAuth)?;
173183
Ok(json!({ "sig": sig, "cert": cert}))
174184
}
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+
}
175220
}

0 commit comments

Comments
 (0)