# HG changeset patch # User Mychaela Falconia # Date 1615255287 0 # Node ID e07de8a9cedf0a8fd33c2b054995897333df6b60 # Parent ac41c42ce8065b9ac7eec801f855938c6ee87589 fc-simtool grcard2-set-comp128 command implemented diff -r ac41c42ce806 -r e07de8a9cedf simtool/dispatch.c --- a/simtool/dispatch.c Sun Mar 07 20:24:05 2021 +0000 +++ b/simtool/dispatch.c Tue Mar 09 02:01:27 2021 +0000 @@ -34,6 +34,7 @@ extern int cmd_grcard1_set_pin(); extern int cmd_grcard2_set_adm5(); extern int cmd_grcard2_set_adm5_hex(); +extern int cmd_grcard2_set_comp128(); extern int cmd_grcard2_set_pin(); extern int cmd_grcard2_set_puk(); extern int cmd_grcard2_set_super(); @@ -164,6 +165,7 @@ {"grcard1-set-pin2", 2, 2, 0, cmd_grcard1_set_pin}, {"grcard2-set-adm5", 1, 1, 0, cmd_grcard2_set_adm5}, {"grcard2-set-adm5-hex", 1, 1, 0, cmd_grcard2_set_adm5_hex}, + {"grcard2-set-comp128", 1, 1, 0, cmd_grcard2_set_comp128}, {"grcard2-set-pin1", 1, 1, 0, cmd_grcard2_set_pin}, {"grcard2-set-pin2", 1, 1, 0, cmd_grcard2_set_pin}, {"grcard2-set-puk1", 1, 1, 0, cmd_grcard2_set_puk}, diff -r ac41c42ce806 -r e07de8a9cedf simtool/grcard2.c --- a/simtool/grcard2.c Sun Mar 07 20:24:05 2021 +0000 +++ b/simtool/grcard2.c Tue Mar 09 02:01:27 2021 +0000 @@ -11,6 +11,8 @@ #include #include #include "simresp.h" +#include "curfile.h" +#include "file_id.h" cmd_grcard2_set_pin(argc, argv) char **argv; @@ -181,3 +183,49 @@ } return(0); } + +static +select_ef_weki() +{ + int rc; + + rc = select_op(DF_GSM); + if (rc < 0) + return(rc); + rc = select_op(0x0001); /* proprietary EF */ + if (rc < 0) + return(rc); + rc = parse_ef_select_response(); + if (rc < 0) + return(rc); + if (curfile_structure != 0x00 || curfile_total_size != 35) { + fprintf(stderr, + "error: EF_WEKI is not a transparent EF of 35 bytes\n"); + return(-1); + } + return(0); +} + +cmd_grcard2_set_comp128(argc, argv) + char **argv; +{ + int rc; + unsigned code; + u_char magic_byte; + + if (argv[1][0] < '1' || argv[1][0] > '3' || argv[1][1]) { + fprintf(stderr, "error: invalid argument\n"); + return(-1); + } + code = argv[1][0] - '1'; + rc = select_ef_weki(); + if (rc < 0) + return(rc); + rc = readbin_op(2, 1); + if (rc < 0) + return(rc); + magic_byte = sim_resp_data[0]; + magic_byte &= 0xFC; + magic_byte |= code; + return update_bin_op(2, &magic_byte, 1); +}