FreeCalypso > hg > fc-pcsc-tools
diff simtool/usersum.c @ 61:633033af6fb8
fc-simtool user-sum command implemented,
a successor to telecom-sum
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 14 Feb 2021 03:27:56 +0000 |
parents | simtool/telsum.c@2071b28cd0c7 |
children | b89bc690dec4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simtool/usersum.c Sun Feb 14 03:27:56 2021 +0000 @@ -0,0 +1,181 @@ +/* + * This module implements the user-sum (summary info) command. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "simresp.h" +#include "curfile.h" +#include "file_id.h" + +#define SST_BYTES_USED 15 + +static +read_sst(sstbuf) + u_char *sstbuf; +{ + int rc; + unsigned rdlen; + + rc = select_op(DF_GSM); + if (rc < 0) + return(rc); + rc = select_op(EF_SST); + if (rc < 0) + return(rc); + rc = parse_ef_select_response(); + if (rc < 0) + return(rc); + if (curfile_structure != 0x00) { + fprintf(stderr, "error: EF_SST is not transparent\n"); + return(-1); + } + if (curfile_total_size < 2) { + fprintf(stderr, + "error: EF_SST is shorter than spec minimum of 2 bytes\n"); + return(-1); + } + rdlen = curfile_total_size; + if (rdlen > SST_BYTES_USED) + rdlen = SST_BYTES_USED; + rc = readbin_op(0, rdlen); + if (rc < 0) + return(rc); + bcopy(sim_resp_data, sstbuf, rdlen); + if (rdlen < SST_BYTES_USED) + bzero(sstbuf + rdlen, SST_BYTES_USED - rdlen); + return(0); +} + +static +do_phonebook_file(file_id, ef_name, book_name) + unsigned file_id; + char *ef_name, *book_name; +{ + int rc; + + rc = select_op(file_id); + if (rc < 0) + return(rc); + rc = parse_ef_select_response(); + if (rc < 0) + return(rc); + if (curfile_structure != 0x01 && curfile_structure != 0x03) { + fprintf(stderr, "error: %s is not record-structured\n", + ef_name); + return(-1); + } + if (curfile_record_len < 14) { + fprintf(stderr, + "error: %s has record length of %u bytes, less than minimum 14\n", + ef_name, curfile_record_len); + return(-1); + } + printf("%s: %u entries, %u bytes of alpha tag\n", book_name, + curfile_record_count, curfile_record_len - 14); + return(0); +} + +static +do_sms_store() +{ + int rc; + + rc = select_op(EF_SMS); + if (rc < 0) + return(rc); + rc = parse_ef_select_response(); + if (rc < 0) + return(rc); + if (curfile_structure != 0x01 || curfile_record_len != 176) { + fprintf(stderr, + "error: EF_SMS is not linear fixed with 176-byte records\n"); + return(-1); + } + printf("SMS store: %u entries\n", curfile_record_count); + return(0); +} + +static +do_smsp_store() +{ + int rc; + + rc = select_op(EF_SMSP); + if (rc < 0) + return(rc); + rc = parse_ef_select_response(); + if (rc < 0) + return(rc); + if (curfile_structure != 0x01) { + fprintf(stderr, "error: EF_SMSP is not linear fixed\n"); + return(-1); + } + if (curfile_record_len < 28) { + fprintf(stderr, + "error: EF_SMSP has record length of %u bytes, less than minimum 14\n", + curfile_record_len); + return(-1); + } + printf("SMS parameter store: %u entries, %u bytes of alpha tag\n", + curfile_record_count, curfile_record_len - 28); + return(0); +} + +cmd_user_sum() +{ + int rc; + u_char sst[SST_BYTES_USED]; + + rc = read_sst(sst); + if (rc < 0) + return(rc); + rc = select_op(DF_TELECOM); + if (rc < 0) + return(rc); + if ((sst[0] & 0x0C) == 0x0C) { + rc = do_phonebook_file(EF_ADN, "EF_ADN", "ADN phonebook"); + if (rc < 0) + return(rc); + } + if ((sst[0] & 0x30) == 0x30) { + rc = do_phonebook_file(EF_FDN, "EF_FDN", "FDN phonebook"); + if (rc < 0) + return(rc); + } + if ((sst[0] & 0xC0) == 0xC0) { + rc = do_sms_store(); + if (rc < 0) + return(rc); + } + if ((sst[1] & 0x03) == 0x03) + printf("AoC service present\n"); + if ((sst[2] & 0x03) == 0x03) { + rc = do_phonebook_file(EF_MSISDN, "EF_MSISDN", "MSISDN record"); + if (rc < 0) + return(rc); + } + if ((sst[2] & 0xC0) == 0xC0) { + rc = do_smsp_store(); + if (rc < 0) + return(rc); + } + if ((sst[3] & 0x03) == 0x03) { + rc = do_phonebook_file(EF_LND, "EF_LND", "LND cyclic store"); + if (rc < 0) + return(rc); + } + if ((sst[4] & 0x0C) == 0x0C) { + rc = do_phonebook_file(EF_SDN, "EF_SDN", "SDN phonebook"); + if (rc < 0) + return(rc); + } + if ((sst[13] & 0x03) == 0x03) + printf("MBDN present\n"); + if ((sst[13] & 0x0C) == 0x0C) + printf("MWIS present\n"); + return(0); +}