annotate serial/exchange.c @ 99:97ba63d9361a

scripts/fcsim1-sst: turn off STK & OTA services In the initial unprogrammed state of the cards from Grcard, SST has services 25 through 29 set to allocated and activated. However, these cards appear to not actually support OTA, ENVELOPE commands do nothing (just return SW 9000), and they were never observed issuing any proactive SIM commands, even after a feature-generous TERMINAL PROFILE. Therefore, let's list these STK & OTA services as allocated, but not activated in our FCSIM1 SST.
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 05 May 2021 04:26:07 +0000
parents be27d1c85861
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
43
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * This module implements the main function of our back end:
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * exchanging APDUs with the SIM.
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 */
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <sys/types.h>
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <stdio.h>
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 static
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 collect_one_byte()
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 u_char buf;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 int rc;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 rc = collect_bytes_from_sim(&buf, 1);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 if (rc < 0)
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 return rc;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 else
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 return buf;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 static void
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 finish_sw(sw1, data, datalen)
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 unsigned sw1, datalen;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 u_char *data;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 unsigned sw2, n;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 int rc;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 rc = collect_one_byte();
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 if (rc < 0) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 printf("back end error at SW2 Rx step\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 sw2 = rc;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 for (n = 0; n < datalen; n++)
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 printf("%02X", data[n]);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 printf("%02X%02X\n", sw1, sw2);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 static void
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 exchange_data_out(ins, data, datalen)
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 unsigned ins, datalen;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 u_char *data;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 int rc;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 unsigned null_count, bytes_sent, ack, ack1;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 ack = ins & 0xFE;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 ack1 = ~ins & 0xFE;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 bytes_sent = 0;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 null_count = 0;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 for (;;) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 rc = collect_one_byte();
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 if (rc < 0) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 printf("back end error at procedure byte step\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 if (rc == 0x60) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 null_count++;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 if (null_count >= 32) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 printf(
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 "ERROR: too many stalling NULL bytes received from SIM\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 continue;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 if ((rc & 0xF0) == 0x60 || (rc & 0xF0) == 0x90) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 finish_sw(rc, 0, 0);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 if ((rc & 0xFE) == ack) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 if (bytes_sent >= datalen) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 bad_xfer_req: printf(
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 "ERROR: SIM requests more xfer after we sent everything\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 rc = send_bytes_to_sim(data + bytes_sent,
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 datalen - bytes_sent);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 if (rc < 0) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 printf("back end error at data output step\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 bytes_sent = datalen;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 continue;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 if ((rc & 0xFE) == ack1) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 if (bytes_sent >= datalen)
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 goto bad_xfer_req;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 rc = send_bytes_to_sim(data + bytes_sent, 1);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 if (rc < 0) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 printf("back end error at data output step\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 bytes_sent++;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 continue;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 printf("ERROR: non-understood procedure byte %02X\n", rc);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 static void
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 exchange_data_in(ins, datalen)
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 unsigned ins, datalen;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 int rc;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 unsigned null_count, bytes_rcvd, ack, ack1;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 u_char data[256];
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 if (!datalen)
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 datalen = 256;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 ack = ins & 0xFE;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 ack1 = ~ins & 0xFE;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 bytes_rcvd = 0;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 null_count = 0;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 for (;;) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 rc = collect_one_byte();
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 if (rc < 0) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 printf("back end error at procedure byte step\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 if (rc == 0x60) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 null_count++;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 if (null_count >= 32) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 printf(
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 "ERROR: too many stalling NULL bytes received from SIM\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 continue;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 if ((rc & 0xF0) == 0x60 || (rc & 0xF0) == 0x90) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 finish_sw(rc, data, bytes_rcvd);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 if ((rc & 0xFE) == ack) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 if (bytes_rcvd >= datalen) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 bad_xfer_req: printf(
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 "ERROR: SIM requests more xfer after we received all expected data\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 rc = collect_bytes_from_sim(data + bytes_rcvd,
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 datalen - bytes_rcvd);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 if (rc < 0) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 printf("back end error at data input step\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 bytes_rcvd = datalen;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 continue;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 if ((rc & 0xFE) == ack1) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 if (bytes_rcvd >= datalen)
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 goto bad_xfer_req;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 rc = collect_one_byte();
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 if (rc < 0) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 printf("back end error at data input step\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 data[bytes_rcvd++] = rc;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 continue;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 printf("ERROR: non-understood procedure byte %02X\n", rc);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 void
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 apdu_exchange(cmd_apdu, cmd_apdu_len)
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 u_char *cmd_apdu;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 unsigned cmd_apdu_len;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 int rc;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 rc = send_bytes_to_sim(cmd_apdu, 5);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 if (rc < 0) {
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 printf("back end error at the command sending step\n");
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 return;
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 }
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 if (cmd_apdu_len > 5)
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 exchange_data_out(cmd_apdu[1], cmd_apdu + 5, cmd_apdu_len - 5);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 else
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 exchange_data_in(cmd_apdu[1], cmd_apdu[4]);
be27d1c85861 serial: main function implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 }