FreeCalypso > hg > freecalypso-hwlab
changeset 92:0ead9444a698
fc-simtool: read operation functions factored out
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 24 Jan 2021 19:59:10 +0000 |
parents | 226b231d00f3 |
children | d4150123ca45 |
files | simtool/Makefile simtool/readcmd.c simtool/readops.c |
diffstat | 3 files changed, 67 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- 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}
--- 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); }
--- /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 <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <pcsclite.h> +#include <winscard.h> +#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); +}