FreeCalypso > hg > fc-pcsc-tools
diff simtool/bfsearch.c @ 145:c2889812788e
fc-simtool bfsearch implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 25 Feb 2021 06:03:13 +0000 |
parents | |
children | 8d55571c8118 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simtool/bfsearch.c Thu Feb 25 06:03:13 2021 +0000 @@ -0,0 +1,96 @@ +/* + * This module implements a brute force search of file ID space at a given + * file system directory level. + */ + +#include <sys/types.h> +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include "simresp.h" + +static +parse_skip_ids(argv, array, total) + char **argv; + unsigned *array, total; +{ + unsigned n; + + for (n = 0; n < total; n++) { + if (!isxdigit(argv[n][0]) || !isxdigit(argv[n][1]) || + !isxdigit(argv[n][2]) || !isxdigit(argv[n][3]) || + argv[n][4]) { + fprintf(stderr, "error: argument is not 4-digit hex\n"); + return(-1); + } + array[n] = strtoul(argv[n], 0, 16); + } + return(0); +} + +cmd_bfsearch(argc, argv, outf) + char **argv; + FILE *outf; +{ + unsigned skip_ids[8], num_skip_ids; + unsigned bfs, n; + int rc; + + num_skip_ids = argc - 1; + rc = parse_skip_ids(argv + 1, skip_ids, num_skip_ids); + if (rc < 0) + return(rc); + rc = elem_select_op(skip_ids[0]); + if (rc < 0) + return(rc); + if (!rc) { + fprintf(stderr, "error: starting file ID 0x%04X not found\n", + skip_ids[0]); + return(-1); + } + for (bfs = 0; bfs <= 0xFFFF; bfs++) { + for (n = 0; n < num_skip_ids; n++) { + if (bfs == skip_ids[n]) + break; + } + if (n < num_skip_ids) + continue; + rc = elem_select_op(bfs); + if (rc < 0) + return(rc); + if (!rc) + continue; + rc = get_response_op(); + if (rc < 0) + return(rc); + if (sim_resp_data_len < 14) + printf("%04X: too-short response struct\n", bfs); + else { + switch (sim_resp_data[6]) { + case 0x01: + printf("%04X: MF\n", bfs); + break; + case 0x02: + printf("%04X: DF\n", bfs); + break; + case 0x04: + printf("%04X: EF (struct %02X)\n", bfs, + sim_resp_data[13]); + break; + default: + printf("%04X: unknown file type %02X\n", bfs, + sim_resp_data[6]); + } + } + rc = elem_select_op(skip_ids[0]); + if (rc < 0) + return(rc); + if (!rc) { + fprintf(stderr, + "reselecting starting file ID 0x%04X not-found error\n", + skip_ids[0]); + return(-1); + } + } + return(0); +}