FreeCalypso > hg > fc-pcsc-tools
view 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 source
/* * 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); }