FreeCalypso > hg > fc-sim-tools
annotate uicc/getresp.c @ 68:c5e7c9e1d857
GSM7 to qstring decoding: rework in a new way, emit \E for Euro
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Thu, 25 Mar 2021 00:04:08 +0000 | 
| parents | b70d35f5476f | 
| children | 
| rev | line source | 
|---|---|
| 15 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 * This module implements an elementary GET RESPONSE command | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 */ | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 #include <sys/types.h> | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 #include <stdio.h> | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 #include <stdlib.h> | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include "simresp.h" | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 cmd_get_response(argc, argv, outf) | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 char **argv; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 FILE *outf; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 { | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 u_char cmd[5]; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 int rc; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 unsigned len; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 len = strtoul(argv[1], 0, 0); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 if (len < 1 || len > 256) { | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 fprintf(stderr, "error: length argument is out of range\n"); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 return(-1); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 } | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 /* GET RESPONSE command APDU */ | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 cmd[0] = 0x00; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 cmd[1] = 0xC0; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 cmd[2] = 0; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 cmd[3] = 0; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 cmd[4] = len; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 rc = apdu_exchange(cmd, 5); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 if (rc < 0) | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 return(rc); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 if (sim_resp_sw != 0x9000) { | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 fprintf(stderr, "bad SW resp to GET RESPONSE: %04X\n", | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 sim_resp_sw); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 return(-1); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 } | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 display_sim_resp_in_hex(outf); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 return(0); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 } | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 get_response_op() | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 { | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 u_char cmd[5]; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 int rc; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 unsigned expect_resp_len; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 expect_resp_len = sim_resp_sw & 0xFF; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 /* GET RESPONSE command APDU */ | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 cmd[0] = 0x00; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 cmd[1] = 0xC0; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 cmd[2] = 0; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 cmd[3] = 0; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 cmd[4] = expect_resp_len; | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 rc = apdu_exchange(cmd, 5); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 if (rc < 0) | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 return(rc); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 if (sim_resp_sw != 0x9000) { | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 fprintf(stderr, "bad SW resp to GET RESPONSE: %04X\n", | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 sim_resp_sw); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 return(-1); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 } | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 if (sim_resp_data_len != expect_resp_len) { | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 fprintf(stderr, | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 "error: GET RESPONSE returned %u bytes, expected %u\n", | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 sim_resp_data_len, expect_resp_len); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 return(-1); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 } | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 return(0); | 
| 
b70d35f5476f
fc-uicc-tool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 } | 
