diff options
author | Harald Welte <laforge@gnumonks.org> | 2016-02-25 19:38:56 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2016-02-26 09:40:34 +0100 |
commit | 4ba66d0098da894ffc91974bb633fad0707a7f5b (patch) | |
tree | 5aadebf86ebf13dca0304fa0e117277f455e9ba0 /firmware/test/card_emu_tests.c | |
parent | 86d047b8f4751dc5bc26560a27cd22e8e5a59ca1 (diff) |
implement forwarding of PTS/PPS from emulator to host PC + test case
Diffstat (limited to 'firmware/test/card_emu_tests.c')
-rw-r--r-- | firmware/test/card_emu_tests.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/firmware/test/card_emu_tests.c b/firmware/test/card_emu_tests.c index 235f511..e071dfa 100644 --- a/firmware/test/card_emu_tests.c +++ b/firmware/test/card_emu_tests.c @@ -180,6 +180,25 @@ static void get_and_verify_rctx(int state, const uint8_t *data, unsigned int len req_ctx_set_state(rctx, RCTX_S_FREE); } +static void get_and_verify_rctx_pps(const uint8_t *data, unsigned int len) +{ + struct req_ctx *rctx; + struct cardemu_usb_msg_pts_info *ptsi; + + rctx = req_ctx_find_get(0, RCTX_S_USB_TX_PENDING, RCTX_S_USB_TX_BUSY); + assert(rctx); + dump_rctx(rctx); + + ptsi = (struct cardemu_usb_msg_pts_info *) rctx->data; + /* FIXME: verify */ + assert(ptsi->hdr.msg_type == CEMU_USB_MSGT_DO_PTS); + assert(!memcmp(ptsi->req, data, len)); + assert(!memcmp(ptsi->resp, data, len)); + + /* free the req_ctx, indicating it has fully arrived on the host */ + req_ctx_set_state(rctx, RCTX_S_FREE); +} + /* emulate a TPDU header being sent by the reader/phone */ static void rdr_send_tpdu_hdr(struct card_handle *ch, const uint8_t *tpdu_hdr) { @@ -304,6 +323,27 @@ test_tpdu_card2reader(struct card_handle *ch, const uint8_t *hdr, const uint8_t card_emu_io_statechg(ch, CARD_IO_CLK, 1); } +const uint8_t pps[] = { + /* PPSS identifies the PPS request or response and is set to + * 'FF'. */ + 0xFF, // PPSS + /* In PPS0, each bit 5, 6 or 7 set to 1 indicates the presence + * of an optional byte PPS 1 , PPS 2 , PPS 3 , + * respectively. Bits 4 to 1 encode a type T to propose a + * transmission protocol. Bit 8 is reserved for future + * use and shall be set to 0. */ + 0b00010000, // PPS0: PPS1 present + 0x00, // PPS1 proposed Fi/Di value + 0xFF ^ 0b00010000// PCK +}; + +static void +test_ppss(struct card_handle *ch) +{ + reader_send_bytes(ch, pps, sizeof(pps)); + get_and_verify_rctx_pps(pps, sizeof(pps)); + card_tx_verify_chars(ch, pps, sizeof(pps)); +} /* READ RECORD (offset 0, 10 bytes) */ const uint8_t tpdu_hdr_read_rec[] = { 0xA0, 0xB2, 0x00, 0x00, 0x0A }; @@ -327,6 +367,8 @@ int main(int argc, char **argv) io_start_card(ch); card_tx_verify_chars(ch, NULL, 0); + test_ppss(ch); + for (i = 0; i < 2; i++) { test_tpdu_reader2card(ch, tpdu_hdr_write_rec, tpdu_body_write_rec, sizeof(tpdu_body_write_rec)); |