blob: 9c804c649688480db643ee3f9b3b456a08059e85 [file] [log] [blame]
Harald Welte1200c822020-02-13 20:43:27 +01001#include <errno.h>
2#include <unistd.h>
3
4#include <osmocom/core/select.h>
5
6#include "client.h"
7
8/* This is a remsim-client with an interactive 'shell', where the user
9 * can type in C-APDUs in hex formats, which will be sent to the bankd /
10 * SIM-card. Responses received from SIM Card via bankd will be printed
11 * in return. */
12
13
14/***********************************************************************
Harald Welte0e968cc2020-02-22 18:16:16 +010015 * stdin frontend code to remsim-client
Harald Welte1200c822020-02-13 20:43:27 +010016 ***********************************************************************/
17
Harald Welte0e968cc2020-02-22 18:16:16 +010018int frontend_request_card_insert(struct bankd_client *bc)
Harald Welte1200c822020-02-13 20:43:27 +010019{
Harald Welte0e968cc2020-02-22 18:16:16 +010020 return 0;
21}
Harald Welte1200c822020-02-13 20:43:27 +010022
Harald Welte0e968cc2020-02-22 18:16:16 +010023int frontend_request_sim_remote(struct bankd_client *bc)
24{
25 return 0;
26}
Harald Welte1200c822020-02-13 20:43:27 +010027
Harald Welte0e968cc2020-02-22 18:16:16 +010028int frontend_request_modem_reset(struct bankd_client *bc)
29{
30 return 0;
31}
32
33int frontend_handle_card2modem(struct bankd_client *bc, const uint8_t *data, size_t len)
34{
35 OSMO_ASSERT(data);
36 printf("R-APDU: %s\n", osmo_hexdump(data, len));
Harald Welte82368402020-02-18 22:59:37 +010037 fflush(stdout);
Harald Welte1200c822020-02-13 20:43:27 +010038
39 return 0;
40}
41
Harald Welte0e968cc2020-02-22 18:16:16 +010042int frontend_handle_set_atr(struct bankd_client *bc, const uint8_t *data, size_t len)
Harald Welte1200c822020-02-13 20:43:27 +010043{
Harald Welte0e968cc2020-02-22 18:16:16 +010044 OSMO_ASSERT(data);
Harald Welte1200c822020-02-13 20:43:27 +010045
Harald Welte0e968cc2020-02-22 18:16:16 +010046 printf("SET_ATR: %s\n", osmo_hexdump(data, len));
Harald Welte82368402020-02-18 22:59:37 +010047 fflush(stdout);
Harald Welte1200c822020-02-13 20:43:27 +010048
Harald Welte1200c822020-02-13 20:43:27 +010049 return 0;
50}
51
Harald Welte0e968cc2020-02-22 18:16:16 +010052int frontend_handle_slot_status(struct bankd_client *bc, const SlotPhysStatus_t *sts)
Harald Welte1200c822020-02-13 20:43:27 +010053{
Harald Welte1200c822020-02-13 20:43:27 +010054 return 0;
55}
56
Harald Weltee580c932020-05-24 16:03:56 +020057int frontend_append_script_env(struct bankd_client *bc, char **env, int idx, size_t max_env)
Harald Welte0e968cc2020-02-22 18:16:16 +010058{
Harald Weltee580c932020-05-24 16:03:56 +020059 return idx;
Harald Welte0e968cc2020-02-22 18:16:16 +010060}
61
62
Harald Welte1200c822020-02-13 20:43:27 +010063/***********************************************************************
64 * Incoming command from the user application (stdin shell in our case)
65 ***********************************************************************/
66
67struct stdin_state {
68 struct osmo_fd ofd;
69 struct msgb *rx_msg;
Harald Welte8e46ab62020-02-14 12:55:43 +010070 struct bankd_client *bc;
Harald Welte1200c822020-02-13 20:43:27 +010071};
72
73/* called every time a command on stdin was received */
74static void handle_stdin_command(struct stdin_state *ss, char *cmd)
75{
Harald Welte8e46ab62020-02-14 12:55:43 +010076 struct bankd_client *bc = ss->bc;
Harald Welte1200c822020-02-13 20:43:27 +010077 RsproPDU_t *pdu;
78 BankSlot_t bslot;
79 uint8_t buf[1024];
80 int rc;
81
Harald Welte8e46ab62020-02-14 12:55:43 +010082 bank_slot2rspro(&bslot, &bc->bankd_slot);
Harald Welte1200c822020-02-13 20:43:27 +010083
84 OSMO_ASSERT(ss->rx_msg);
85
Harald Welte1200c822020-02-13 20:43:27 +010086 if (!strcasecmp(cmd, "RESET")) {
87 /* reset the [remote] card */
Harald Welte8e46ab62020-02-14 12:55:43 +010088 pdu = rspro_gen_ClientSlotStatusInd(bc->srv_conn.clslot, &bslot,
Harald Welte1200c822020-02-13 20:43:27 +010089 true, false, false, true);
Harald Welte8e46ab62020-02-14 12:55:43 +010090 server_conn_send_rspro(&bc->bankd_conn, pdu);
Harald Welte1200c822020-02-13 20:43:27 +010091 } else {
92 /* we assume the user has entered a C-APDU as hex string. parse + send */
93 rc = osmo_hexparse(cmd, buf, sizeof(buf));
94 if (rc < 0) {
95 fprintf(stderr, "ERROR parsing C-APDU `%s'!\n", cmd);
96 return;
97 }
Harald Welte8e46ab62020-02-14 12:55:43 +010098 if (!bc->srv_conn.clslot) {
Harald Welte1200c822020-02-13 20:43:27 +010099 fprintf(stderr, "Cannot send command; no client slot\n");
100 return;
101 }
102
103 /* Send CMD APDU to [remote] card */
Harald Welte8e46ab62020-02-14 12:55:43 +0100104 pdu = rspro_gen_TpduModem2Card(bc->srv_conn.clslot, &bslot, buf, rc);
105 server_conn_send_rspro(&bc->bankd_conn, pdu);
Harald Welte1200c822020-02-13 20:43:27 +0100106 }
107}
108
109/* call-back function for stdin read. Gather bytes in buffer until CR/LF received */
110static int stdin_fd_cb(struct osmo_fd *ofd, unsigned int what)
111{
112 struct stdin_state *ss = ofd->data;
113 char *cur;
114 int rc, i;
115
116 OSMO_ASSERT(what & OSMO_FD_READ);
117
118 if (!ss->rx_msg) {
119 ss->rx_msg = msgb_alloc(1024, "stdin");
120 OSMO_ASSERT(ss->rx_msg);
121 }
122
123 cur = (char *) ss->rx_msg->tail;
124 rc = read(ofd->fd, cur, msgb_tailroom(ss->rx_msg));
125 if (rc < 0)
126 return rc;
127 msgb_put(ss->rx_msg, rc);
128
129 for (i = 0; i < rc; i++) {
130 if (cur[i] == '\r' || cur[i] == '\n') {
131 cur[i] = '\0';
132 /* dispatch the command */
133 handle_stdin_command(ss, cur);
134 /* FIXME: possibly other commands */
135 msgb_free(ss->rx_msg);
136 ss->rx_msg = NULL;
137 }
138 }
139
140 return 0;
141}
142
143
144
145/* main function */
Harald Welte8e46ab62020-02-14 12:55:43 +0100146int client_user_main(struct bankd_client *bc)
Harald Welte1200c822020-02-13 20:43:27 +0100147{
148 struct stdin_state ss;
149
150 /* register stdin file descriptor with osmocom select loop abstraction */
151 memset(&ss, 0, sizeof(ss));
152 osmo_fd_setup(&ss.ofd, fileno(stdin), OSMO_FD_READ, &stdin_fd_cb, &ss, 0);
153 osmo_fd_register(&ss.ofd);
Harald Welte8e46ab62020-02-14 12:55:43 +0100154 ss.bc = bc;
Harald Welte1200c822020-02-13 20:43:27 +0100155
156 while (1) {
157 osmo_select_main(0);
158 }
159}