Skip to content

Commit cf6fedc

Browse files
sosthene-nitrokeyrobin-nitrokey
authored andcommitted
Migrate to interchange 0.3.0
1 parent fcd5ad3 commit cf6fedc

File tree

6 files changed

+54
-57
lines changed

6 files changed

+54
-57
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ documentation = "https://docs.rs/apdu-dispatch"
1313
[dependencies]
1414
delog = "0.1.4"
1515
heapless = "0.7"
16-
interchange = "0.2.0"
16+
interchange = "0.3.0"
1717
iso7816 = "0.1.1"
1818

1919
[dev-dependencies]

fuzz/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ cargo-fuzz = true
1111
[dependencies]
1212
libfuzzer-sys = "0.4"
1313
arbitrary = { version = "1", features = ["derive"] }
14-
interchange = "0.2.0"
14+
interchange = "0.3.0"
1515

1616
[dependencies.apdu-dispatch]
1717
path = ".."

fuzz/fuzz_targets/fuzz_target_1.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use apdu_dispatch::app::Result as AppResult;
33
use apdu_dispatch::{dispatch::Interface, interchanges, iso7816, App};
44
use arbitrary::{Arbitrary, Unstructured};
5-
use interchange::Interchange;
5+
use interchange::Channel;
66
use libfuzzer_sys::fuzz_target;
77

88
use std::convert::TryFrom;
@@ -87,8 +87,6 @@ impl App<{ apdu_dispatch::command::SIZE }, { apdu_dispatch::response::SIZE }> fo
8787
}
8888

8989
fuzz_target!(|input: Input| {
90-
unsafe { interchanges::Contact::reset_claims() };
91-
unsafe { interchanges::Contactless::reset_claims() };
9290
let mut apps: Vec<_> = input
9391
.apps
9492
.into_iter()
@@ -100,11 +98,15 @@ fuzz_target!(|input: Input| {
10098
.map(|s| (s as &mut dyn apdu_dispatch::App<7609, 7609>))
10199
.collect();
102100

103-
let (mut contact_requester, contact_responder) =
104-
interchanges::Contact::claim().expect("could not setup ccid ApduInterchange");
101+
let contact = Channel::new();
102+
let (mut contact_requester, contact_responder) = contact
103+
.split()
104+
.expect("could not setup ccid ApduInterchange");
105105

106-
let (mut contactless_requester, contactless_responder) =
107-
interchanges::Contactless::claim().expect("could not setup iso14443 ApduInterchange");
106+
let contactless = Channel::new();
107+
let (mut contactless_requester, contactless_responder) = contactless
108+
.split()
109+
.expect("could not setup iso14443 ApduInterchange");
108110

109111
let mut apdu_dispatch =
110112
apdu_dispatch::dispatch::ApduDispatch::new(contact_responder, contactless_responder);
@@ -113,11 +115,11 @@ fuzz_target!(|input: Input| {
113115
apdu.truncate(interchanges::SIZE);
114116
if requester {
115117
contact_requester
116-
.request(&interchanges::Data::from_slice(&apdu).unwrap())
118+
.request(interchanges::Data::from_slice(&apdu).unwrap())
117119
.expect("could not deposit command");
118120
} else {
119121
contactless_requester
120-
.request(&interchanges::Data::from_slice(&apdu).unwrap())
122+
.request(interchanges::Data::from_slice(&apdu).unwrap())
121123
.expect("could not deposit command");
122124
}
123125
apdu_dispatch.poll(&mut dyn_apps);

src/dispatch.rs

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
use crate::command::SIZE as CommandSize;
1212
use crate::response::SIZE as ResponseSize;
1313
use crate::App;
14-
use crate::{interchanges, response, Command};
14+
use crate::{
15+
interchanges::{self, Responder},
16+
response, Command,
17+
};
1518
use core::convert::TryInto;
1619

1720
use iso7816::{command::FromSliceError, Aid, Instruction, Result, Status};
@@ -36,8 +39,6 @@ pub enum RequestType {
3639
None,
3740
}
3841

39-
use interchange::Responder;
40-
4142
#[derive(PartialEq)]
4243
enum RawApduBuffer {
4344
None,
@@ -71,19 +72,19 @@ impl ApduBuffer {
7172
}
7273
}
7374

74-
pub struct ApduDispatch {
75+
pub struct ApduDispatch<'pipe> {
7576
// or currently_selected_aid, or...
7677
current_aid: Option<Aid>,
77-
contact: Responder<interchanges::Contact>,
78-
contactless: Responder<interchanges::Contactless>,
78+
contact: Responder<'pipe>,
79+
contactless: Responder<'pipe>,
7980
current_interface: Interface,
8081

8182
buffer: ApduBuffer,
8283
response_len_expected: usize,
8384
was_request_chained: bool,
8485
}
8586

86-
impl ApduDispatch {
87+
impl<'pipe> ApduDispatch<'pipe> {
8788
fn apdu_type<const S: usize>(apdu: &iso7816::Command<S>) -> RequestType {
8889
info!("instruction: {:?} {}", apdu.instruction(), apdu.p1);
8990
if apdu.instruction() == Instruction::Select && (apdu.p1 & 0x04) != 0 {
@@ -101,10 +102,7 @@ impl ApduDispatch {
101102
}
102103
}
103104

104-
pub fn new(
105-
contact: Responder<interchanges::Contact>,
106-
contactless: Responder<interchanges::Contactless>,
107-
) -> ApduDispatch {
105+
pub fn new(contact: Responder<'pipe>, contactless: Responder<'pipe>) -> Self {
108106
ApduDispatch {
109107
current_aid: None,
110108
contact,
@@ -185,12 +183,12 @@ impl ApduDispatch {
185183
// acknowledge
186184
Interface::Contact => {
187185
self.contact
188-
.respond(&Status::Success.try_into().unwrap())
186+
.respond(Status::Success.try_into().unwrap())
189187
.expect("Could not respond");
190188
}
191189
Interface::Contactless => {
192190
self.contactless
193-
.respond(&Status::Success.try_into().unwrap())
191+
.respond(Status::Success.try_into().unwrap())
194192
.expect("Could not respond");
195193
}
196194
}
@@ -258,12 +256,11 @@ impl ApduDispatch {
258256
match interface {
259257
Interface::Contactless => self
260258
.contactless
261-
.respond(&response.into())
262-
.expect("cant respond"),
263-
Interface::Contact => self
264-
.contact
265-
.respond(&response.into())
259+
.respond(response.into())
266260
.expect("cant respond"),
261+
Interface::Contact => {
262+
self.contact.respond(response.into()).expect("cant respond")
263+
}
267264
}
268265
RequestType::None
269266
}
@@ -275,7 +272,7 @@ impl ApduDispatch {
275272

276273
#[inline(never)]
277274
fn reply_error(&mut self, status: Status) {
278-
self.respond(&status.into());
275+
self.respond(status.into());
279276
self.buffer.raw = RawApduBuffer::None;
280277
}
281278

@@ -333,7 +330,7 @@ impl ApduDispatch {
333330
}
334331
};
335332
self.buffer.raw = new_state;
336-
self.respond(&response);
333+
self.respond(response);
337334
}
338335

339336
#[inline(never)]
@@ -463,7 +460,7 @@ impl ApduDispatch {
463460
}
464461

465462
#[inline(never)]
466-
fn respond(&mut self, message: &interchanges::Data) {
463+
fn respond(&mut self, message: interchanges::Data) {
467464
debug!("<< {}", hex_str!(message.as_slice(), sep:""));
468465
match self.current_interface {
469466
Interface::Contactless => self.contactless.respond(message).expect("cant respond"),

src/interchanges.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
pub const SIZE: usize = 3072;
22
pub type Data = iso7816::Data<SIZE>;
3-
4-
interchange::interchange! {
5-
Contact: (Data, Data)
6-
}
7-
8-
interchange::interchange! {
9-
Contactless: (Data, Data)
10-
}
3+
pub type Responder<'pipe> = interchange::Responder<'pipe, Data, Data>;
4+
pub type Requester<'pipe> = interchange::Responder<'pipe, Data, Data>;

tests/dispatch.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use apdu_dispatch::dispatch;
33
use apdu_dispatch::Command;
44
use apdu_dispatch::{interchanges, response};
55
use hex_literal::hex;
6-
use interchange::Interchange;
6+
use interchange::Channel;
77
use iso7816::Status;
88

99
#[macro_use]
@@ -189,13 +189,16 @@ fn run_apdus(apdu_response_pairs: &[&[u8]]) {
189189
assert!((apdu_response_pairs.len() & 1) == 0);
190190

191191
Delogger::init_default(delog::LevelFilter::Info, &STDOUT_FLUSHER).ok();
192-
unsafe { interchanges::Contact::reset_claims() };
193-
unsafe { interchanges::Contactless::reset_claims() };
194-
let (mut contact_requester, contact_responder) =
195-
interchanges::Contact::claim().expect("could not setup ccid ApduInterchange");
196192

197-
let (_contactless_requester, contactless_responder) =
198-
interchanges::Contactless::claim().expect("could not setup iso14443 ApduInterchange");
193+
let contact = Channel::new();
194+
let (mut contact_requester, contact_responder) = contact
195+
.split()
196+
.expect("could not setup ccid ApduInterchange");
197+
198+
let contactless = Channel::new();
199+
let (_contactless_requester, contactless_responder) = contactless
200+
.split()
201+
.expect("could not setup iso14443 ApduInterchange");
199202

200203
let mut apdu_dispatch =
201204
apdu_dispatch::dispatch::ApduDispatch::new(contact_responder, contactless_responder);
@@ -222,7 +225,7 @@ fn run_apdus(apdu_response_pairs: &[&[u8]]) {
222225
dump_hex(raw_req);
223226

224227
contact_requester
225-
.request(&interchanges::Data::from_slice(raw_req).unwrap())
228+
.request(interchanges::Data::from_slice(raw_req).unwrap())
226229
.expect("could not deposit command");
227230

228231
apdu_dispatch.poll(&mut [&mut app0, &mut app1, &mut app2, &mut app3, &mut app4]);
@@ -1055,22 +1058,23 @@ fn response_larger_than_interchange() {
10551058
#[test]
10561059
#[serial]
10571060
fn check_stack_burden() {
1058-
unsafe { interchanges::Contact::reset_claims() };
1059-
unsafe { interchanges::Contactless::reset_claims() };
1060-
1061-
let (mut contact_requester, contact_responder) =
1062-
interchanges::Contact::claim().expect("could not setup ccid ApduInterchange");
1061+
let contact = Channel::new();
1062+
let (mut contact_requester, contact_responder) = contact
1063+
.split()
1064+
.expect("could not setup ccid ApduInterchange");
10631065

1064-
let (_contactless_requester, contactless_responder) =
1065-
interchanges::Contactless::claim().expect("could not setup iso14443 ApduInterchange");
1066+
let contactless = Channel::new();
1067+
let (_contactless_requester, contactless_responder) = contactless
1068+
.split()
1069+
.expect("could not setup iso14443 ApduInterchange");
10661070

10671071
let mut apdu_dispatch =
10681072
apdu_dispatch::dispatch::ApduDispatch::new(contact_responder, contactless_responder);
10691073

10701074
let mut app1 = TestApp1 {};
10711075

10721076
contact_requester
1073-
.request(&interchanges::Data::from_slice(&hex!("00A40400050A01000001")).unwrap())
1077+
.request(interchanges::Data::from_slice(&hex!("00A40400050A01000001")).unwrap())
10741078
.expect("could not deposit command");
10751079

10761080
apdu_dispatch.poll(&mut [&mut app1]);
@@ -1081,7 +1085,7 @@ fn check_stack_burden() {
10811085
dump_hex(&response);
10821086

10831087
contact_requester
1084-
.request(&interchanges::Data::from_slice(&hex!("0015000000")).unwrap())
1088+
.request(interchanges::Data::from_slice(&hex!("0015000000")).unwrap())
10851089
.expect("could not deposit command");
10861090

10871091
apdu_dispatch.poll(&mut [&mut app1]);

0 commit comments

Comments
 (0)