# HG changeset patch # User Mychaela Falconia # Date 1611518350 0 # Node ID 0ead9444a698e7f1d62f360cb9bc6ec154b5b95a # Parent 226b231d00f389485423118ce05f9ac0a7bb395f fc-simtool: read operation functions factored out diff -r 226b231d00f3 -r 0ead9444a698 simtool/Makefile --- a/simtool/Makefile Sun Jan 24 18:46:11 2021 +0000 +++ b/simtool/Makefile Sun Jan 24 19:59:10 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 readcmd.o select.o + names.o readcmd.o readops.o select.o all: ${PROG} diff -r 226b231d00f3 -r 0ead9444a698 simtool/readcmd.c --- a/simtool/readcmd.c Sun Jan 24 18:46:11 2021 +0000 +++ b/simtool/readcmd.c Sun Jan 24 19:59:10 2021 +0000 @@ -9,7 +9,6 @@ char **argv; { unsigned offset, len; - u_char cmd[5]; int rc; offset = strtoul(argv[1], 0, 0); @@ -22,26 +21,9 @@ 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); + rc = readbin_op(offset, len); 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); } @@ -50,7 +32,6 @@ char **argv; { unsigned recno, len; - u_char cmd[5]; int rc; recno = strtoul(argv[1], 0, 0); @@ -74,26 +55,9 @@ } len = curfile_record_len; } - /* READ RECORD command APDU */ - cmd[0] = 0xA0; - cmd[1] = 0xB2; - cmd[2] = recno; - cmd[3] = 0x04; - cmd[4] = len; - rc = apdu_exchange(cmd, 5); + rc = readrec_op(recno, 0x04, len); if (rc < 0) return(rc); - if (sim_resp_sw != 0x9000) { - fprintf(stderr, "bad SW response to READ RECORD: %04X\n", - sim_resp_sw); - return(-1); - } - if (sim_resp_data_len != len) { - fprintf(stderr, - "error: READ RECORD returned %u bytes, expected %u\n", - sim_resp_data_len, len); - return(-1); - } display_sim_resp_in_hex(); return(0); } diff -r 226b231d00f3 -r 0ead9444a698 simtool/readops.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simtool/readops.c Sun Jan 24 19:59:10 2021 +0000 @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include +#include "globals.h" + +readbin_op(offset, len) + unsigned offset, len; +{ + u_char cmd[5]; + int rc; + + /* 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); + } + return(0); +} + +readrec_op(recno, mode, len) + unsigned recno, mode, len; +{ + u_char cmd[5]; + int rc; + + /* READ RECORD command APDU */ + cmd[0] = 0xA0; + cmd[1] = 0xB2; + cmd[2] = recno; + cmd[3] = mode; + 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 RECORD: %04X\n", + sim_resp_sw); + return(-1); + } + if (sim_resp_data_len != len) { + fprintf(stderr, + "error: READ RECORD returned %u bytes, expected %u\n", + sim_resp_data_len, len); + return(-1); + } + return(0); +}