# HG changeset patch # User Mychaela Falconia # Date 1611512284 0 # Node ID 53e2c00566afefd836a2caac439b5f0e8fb4e0ba # Parent fb75855a74a9d1e2d80569b6c33780fdb10e6ba8 fc-simtool: readbin command implemented diff -r fb75855a74a9 -r 53e2c00566af simtool/Makefile --- a/simtool/Makefile Sun Jan 24 18:03:55 2021 +0000 +++ b/simtool/Makefile Sun Jan 24 18:18:04 2021 +0000 @@ -2,7 +2,7 @@ CFLAGS= -O2 -I/usr/include/PCSC PROG= fc-simtool OBJS= apdu.o atr.o cardconnect.o dispatch.o globals.o hexdump.o main.o \ - names.o select.o + names.o readcmd.o select.o all: ${PROG} diff -r fb75855a74a9 -r 53e2c00566af simtool/dispatch.c --- a/simtool/dispatch.c Sun Jan 24 18:03:55 2021 +0000 +++ b/simtool/dispatch.c Sun Jan 24 18:18:04 2021 +0000 @@ -12,6 +12,7 @@ #include #include "globals.h" +extern int cmd_readbin(); extern int cmd_select(); extern int display_sim_resp_in_hex(); @@ -31,6 +32,7 @@ } cmdtab[] = { {"exit", 0, 0, cmd_exit}, {"quit", 0, 0, cmd_exit}, + {"readbin", 2, 2, cmd_readbin}, {"select", 1, 1, cmd_select}, {"sim-resp", 0, 0, display_sim_resp_in_hex}, {0, 0, 0, 0} diff -r fb75855a74a9 -r 53e2c00566af simtool/readcmd.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simtool/readcmd.c Sun Jan 24 18:18:04 2021 +0000 @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include "globals.h" + +cmd_readbin(argc, argv) + char **argv; +{ + unsigned offset, len; + u_char cmd[5]; + int rc; + + offset = strtoul(argv[1], 0, 0); + if (offset > 0xFFFF) { + fprintf(stderr, "error: offset argument is out of range\n"); + return(-1); + } + len = strtoul(argv[2], 0, 0); + if (len < 1 || len > 256) { + fprintf(stderr, "error: length argument is out of range\n"); + return(-1); + } + /* READ BINARY command APDU */ + cmd[0] = 0xA0; + cmd[1] = 0xB0; + cmd[2] = offset >> 8; + cmd[3] = offset; + cmd[4] = len; + rc = apdu_exchange(cmd, 5); + if (rc < 0) + return(rc); + if (sim_resp_sw != 0x9000) { + fprintf(stderr, "bad SW response to READ BINARY: %04X\n", + sim_resp_sw); + return(-1); + } + if (sim_resp_data_len != len) { + fprintf(stderr, + "error: READ BINARY returned %u bytes, expected %u\n", + sim_resp_data_len, len); + return(-1); + } + display_sim_resp_in_hex(); + return(0); +}