FreeCalypso > hg > freecalypso-hwlab
changeset 133:f3bdefbeae38
fc-uicc-tool: readbin and readrec commands implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 04 Feb 2021 01:45:16 +0000 |
parents | 5af88fa11b54 |
children | 69628bcfec17 |
files | uicc/Makefile uicc/dispatch.c uicc/readcmd.c uicc/readops.c |
diffstat | 4 files changed, 122 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/uicc/Makefile Thu Feb 04 01:36:54 2021 +0000 +++ b/uicc/Makefile Thu Feb 04 01:45:16 2021 +0000 @@ -2,7 +2,7 @@ CFLAGS= -O2 -I/usr/include/PCSC PROG= fc-uicc-tool OBJS= apdu.o atr.o cardconnect.o dispatch.o exit.o globals.o hexdump.o main.o\ - names.o script.o select.o + names.o readcmd.o readops.o script.o select.o all: ${PROG}
--- a/uicc/dispatch.c Thu Feb 04 01:36:54 2021 +0000 +++ b/uicc/dispatch.c Thu Feb 04 01:45:16 2021 +0000 @@ -9,6 +9,8 @@ #include <stdlib.h> extern int cmd_exec(); +extern int cmd_readbin(); +extern int cmd_readrec(); extern int cmd_select(); extern int display_sim_resp_in_hex(); @@ -23,6 +25,8 @@ {"exec", 1, 1, cmd_exec}, {"exit", 0, 0, good_exit}, {"quit", 0, 0, good_exit}, + {"readbin", 2, 2, cmd_readbin}, + {"readrec", 2, 2, cmd_readrec}, {"select", 1, 1, cmd_select}, {"sim-resp", 0, 0, display_sim_resp_in_hex}, {0, 0, 0, 0}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uicc/readcmd.c Thu Feb 04 01:45:16 2021 +0000 @@ -0,0 +1,53 @@ +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <pcsclite.h> +#include <winscard.h> +#include "globals.h" + +cmd_readbin(argc, argv) + char **argv; +{ + unsigned offset, len; + int rc; + + offset = strtoul(argv[1], 0, 0); + if (offset > 0x7FFF) { + 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); + } + rc = readbin_op(offset, len); + if (rc < 0) + return(rc); + display_sim_resp_in_hex(); + return(0); +} + +cmd_readrec(argc, argv) + char **argv; +{ + unsigned recno, len; + int rc; + + recno = strtoul(argv[1], 0, 0); + if (recno < 1 || recno > 255) { + fprintf(stderr, + "error: record number argument is out of range\n"); + return(-1); + } + len = strtoul(argv[2], 0, 0); + if (len < 1 || len > 255) { + fprintf(stderr, "error: length argument is out of range\n"); + return(-1); + } + rc = readrec_op(recno, 0x04, len); + if (rc < 0) + return(rc); + display_sim_resp_in_hex(); + return(0); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uicc/readops.c Thu Feb 04 01:45:16 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] = 0x00; + 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] = 0x00; + 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); +}