xref: /aosp_15_r20/external/libese/tools/ese_replay/main.c (revision 5c4dab75aa57366379dce576b1a9e082a44e2b3a)
1*5c4dab75SAndroid Build Coastguard Worker /*
2*5c4dab75SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*5c4dab75SAndroid Build Coastguard Worker  *
4*5c4dab75SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*5c4dab75SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*5c4dab75SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*5c4dab75SAndroid Build Coastguard Worker  *
8*5c4dab75SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*5c4dab75SAndroid Build Coastguard Worker  *
10*5c4dab75SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*5c4dab75SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*5c4dab75SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5c4dab75SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*5c4dab75SAndroid Build Coastguard Worker  * limitations under the License.
15*5c4dab75SAndroid Build Coastguard Worker  *
16*5c4dab75SAndroid Build Coastguard Worker  * Usage:
17*5c4dab75SAndroid Build Coastguard Worker  *   $0 [impl name] < line-by-line-input-and-expect
18*5c4dab75SAndroid Build Coastguard Worker  */
19*5c4dab75SAndroid Build Coastguard Worker 
20*5c4dab75SAndroid Build Coastguard Worker #include <ctype.h>
21*5c4dab75SAndroid Build Coastguard Worker #include <stdint.h>
22*5c4dab75SAndroid Build Coastguard Worker #include <stdio.h>
23*5c4dab75SAndroid Build Coastguard Worker #include <stdlib.h>
24*5c4dab75SAndroid Build Coastguard Worker #include <string.h>
25*5c4dab75SAndroid Build Coastguard Worker #include <unistd.h>
26*5c4dab75SAndroid Build Coastguard Worker 
27*5c4dab75SAndroid Build Coastguard Worker #define LOG_TAG "ese-replay"
28*5c4dab75SAndroid Build Coastguard Worker #include <ese/ese.h>
29*5c4dab75SAndroid Build Coastguard Worker #include <ese/log.h>
30*5c4dab75SAndroid Build Coastguard Worker 
31*5c4dab75SAndroid Build Coastguard Worker #include "buffer.h"
32*5c4dab75SAndroid Build Coastguard Worker #include "hw.h"
33*5c4dab75SAndroid Build Coastguard Worker #include "payload.h"
34*5c4dab75SAndroid Build Coastguard Worker 
35*5c4dab75SAndroid Build Coastguard Worker const struct SupportedHardware kSupportedHardware = {
36*5c4dab75SAndroid Build Coastguard Worker     .len = 3,
37*5c4dab75SAndroid Build Coastguard Worker     .hw =
38*5c4dab75SAndroid Build Coastguard Worker         {
39*5c4dab75SAndroid Build Coastguard Worker             {
40*5c4dab75SAndroid Build Coastguard Worker                 .name = "nq-nci",
41*5c4dab75SAndroid Build Coastguard Worker                 .sym = "ESE_HW_NXP_PN80T_NQ_NCI_ops",
42*5c4dab75SAndroid Build Coastguard Worker                 .lib = "libese-hw-nxp-pn80t-nq-nci.so",
43*5c4dab75SAndroid Build Coastguard Worker                 .options = NULL,
44*5c4dab75SAndroid Build Coastguard Worker             },
45*5c4dab75SAndroid Build Coastguard Worker             {
46*5c4dab75SAndroid Build Coastguard Worker                 .name = "fake",
47*5c4dab75SAndroid Build Coastguard Worker                 .sym = "ESE_HW_FAKE_ops",
48*5c4dab75SAndroid Build Coastguard Worker                 .lib = "libese-hw-fake.so",
49*5c4dab75SAndroid Build Coastguard Worker                 .options = NULL,
50*5c4dab75SAndroid Build Coastguard Worker             },
51*5c4dab75SAndroid Build Coastguard Worker             {
52*5c4dab75SAndroid Build Coastguard Worker                 .name = "echo",
53*5c4dab75SAndroid Build Coastguard Worker                 .sym = "ESE_HW_ECHO_ops",
54*5c4dab75SAndroid Build Coastguard Worker                 .lib = "libese-hw-echo.so",
55*5c4dab75SAndroid Build Coastguard Worker                 .options = NULL,
56*5c4dab75SAndroid Build Coastguard Worker             },
57*5c4dab75SAndroid Build Coastguard Worker         },
58*5c4dab75SAndroid Build Coastguard Worker };
59*5c4dab75SAndroid Build Coastguard Worker 
main(int argc,char ** argv)60*5c4dab75SAndroid Build Coastguard Worker int main(int argc, char **argv) {
61*5c4dab75SAndroid Build Coastguard Worker   if (argc != 2) {
62*5c4dab75SAndroid Build Coastguard Worker     printf("Usage:\n%s [hw_impl] < file_with_apdus\n\n"
63*5c4dab75SAndroid Build Coastguard Worker            "File format:\n"
64*5c4dab75SAndroid Build Coastguard Worker            "  hex-apdu-to-send hex-trailing-response-bytes\\n\n"
65*5c4dab75SAndroid Build Coastguard Worker            "\n"
66*5c4dab75SAndroid Build Coastguard Worker            "For example,\n"
67*5c4dab75SAndroid Build Coastguard Worker            "  echo -e '00A4040000 9000\\n80CA9F7F00 9000\\n' | %s nq-nci\n",
68*5c4dab75SAndroid Build Coastguard Worker            argv[0], argv[0]);
69*5c4dab75SAndroid Build Coastguard Worker     print_supported_hardware(&kSupportedHardware);
70*5c4dab75SAndroid Build Coastguard Worker     return 1;
71*5c4dab75SAndroid Build Coastguard Worker   }
72*5c4dab75SAndroid Build Coastguard Worker   int hw_id = find_supported_hardware(&kSupportedHardware, argv[1]);
73*5c4dab75SAndroid Build Coastguard Worker   if (hw_id < 0) {
74*5c4dab75SAndroid Build Coastguard Worker     fprintf(stderr, "Unknown hardware name: %s\n", argv[1]);
75*5c4dab75SAndroid Build Coastguard Worker     return 3;
76*5c4dab75SAndroid Build Coastguard Worker   }
77*5c4dab75SAndroid Build Coastguard Worker   const struct Hardware *hw = &kSupportedHardware.hw[hw_id];
78*5c4dab75SAndroid Build Coastguard Worker 
79*5c4dab75SAndroid Build Coastguard Worker   struct EseInterface ese;
80*5c4dab75SAndroid Build Coastguard Worker   printf("[-] Initializing eSE\n");
81*5c4dab75SAndroid Build Coastguard Worker 
82*5c4dab75SAndroid Build Coastguard Worker   if (!initialize_hardware(&ese, hw)) {
83*5c4dab75SAndroid Build Coastguard Worker     fprintf(stderr, "Could not initialize hardware\n");
84*5c4dab75SAndroid Build Coastguard Worker     return 2;
85*5c4dab75SAndroid Build Coastguard Worker   }
86*5c4dab75SAndroid Build Coastguard Worker   printf("eSE implementation selected: %s\n", ese_name(&ese));
87*5c4dab75SAndroid Build Coastguard Worker   if (ese_open(&ese, hw->options)) {
88*5c4dab75SAndroid Build Coastguard Worker     ALOGE("Cannot open hw");
89*5c4dab75SAndroid Build Coastguard Worker     if (ese_error(&ese)) {
90*5c4dab75SAndroid Build Coastguard Worker       ALOGE("eSE error (%d): %s", ese_error_code(&ese),
91*5c4dab75SAndroid Build Coastguard Worker             ese_error_message(&ese));
92*5c4dab75SAndroid Build Coastguard Worker     }
93*5c4dab75SAndroid Build Coastguard Worker     return 5;
94*5c4dab75SAndroid Build Coastguard Worker   }
95*5c4dab75SAndroid Build Coastguard Worker   printf("eSE is open\n");
96*5c4dab75SAndroid Build Coastguard Worker   struct Payload payload;
97*5c4dab75SAndroid Build Coastguard Worker   if (!payload_init(&payload, 10 * 1024 * 1024, 1024 * 4)) {
98*5c4dab75SAndroid Build Coastguard Worker     ALOGE("Failed to initialize payload.");
99*5c4dab75SAndroid Build Coastguard Worker     return -1;
100*5c4dab75SAndroid Build Coastguard Worker   }
101*5c4dab75SAndroid Build Coastguard Worker 
102*5c4dab75SAndroid Build Coastguard Worker   struct Buffer reply;
103*5c4dab75SAndroid Build Coastguard Worker   buffer_init(&reply, 2048);
104*5c4dab75SAndroid Build Coastguard Worker   while (!feof(stdin) && payload_read(&payload, stdin)) {
105*5c4dab75SAndroid Build Coastguard Worker     payload_dump(&payload, stdout);
106*5c4dab75SAndroid Build Coastguard Worker     reply.len = (uint32_t)ese_transceive(
107*5c4dab75SAndroid Build Coastguard Worker         &ese, payload.tx.buffer, payload.tx.len, reply.buffer, reply.size);
108*5c4dab75SAndroid Build Coastguard Worker     if ((int)reply.len < 0 || ese_error(&ese)) {
109*5c4dab75SAndroid Build Coastguard Worker       printf("Transceive error. See logcat -s ese-replay\n");
110*5c4dab75SAndroid Build Coastguard Worker       ALOGE("transceived returned failure: %d\n", (int)reply.len);
111*5c4dab75SAndroid Build Coastguard Worker       if (ese_error(&ese)) {
112*5c4dab75SAndroid Build Coastguard Worker         ALOGE("An error (%d) occurred: %s", ese_error_code(&ese),
113*5c4dab75SAndroid Build Coastguard Worker               ese_error_message(&ese));
114*5c4dab75SAndroid Build Coastguard Worker       }
115*5c4dab75SAndroid Build Coastguard Worker       break;
116*5c4dab75SAndroid Build Coastguard Worker     }
117*5c4dab75SAndroid Build Coastguard Worker     buffer_dump(&reply, "", "Response", 240, stdout);
118*5c4dab75SAndroid Build Coastguard Worker     if (reply.len < payload.expected.len) {
119*5c4dab75SAndroid Build Coastguard Worker       printf("Received less data than expected: %u < %u\n", reply.len,
120*5c4dab75SAndroid Build Coastguard Worker              payload.expected.len);
121*5c4dab75SAndroid Build Coastguard Worker       break;
122*5c4dab75SAndroid Build Coastguard Worker     }
123*5c4dab75SAndroid Build Coastguard Worker 
124*5c4dab75SAndroid Build Coastguard Worker     /* Only compare the end. This allows a simple APDU success match. */
125*5c4dab75SAndroid Build Coastguard Worker     if (memcmp(payload.expected.buffer,
126*5c4dab75SAndroid Build Coastguard Worker                (reply.buffer + reply.len) - payload.expected.len,
127*5c4dab75SAndroid Build Coastguard Worker                payload.expected.len)) {
128*5c4dab75SAndroid Build Coastguard Worker       printf("Response did not match. Aborting!\n");
129*5c4dab75SAndroid Build Coastguard Worker       break;
130*5c4dab75SAndroid Build Coastguard Worker     }
131*5c4dab75SAndroid Build Coastguard Worker   }
132*5c4dab75SAndroid Build Coastguard Worker   buffer_free(&reply);
133*5c4dab75SAndroid Build Coastguard Worker   printf("Transmissions complete.\n");
134*5c4dab75SAndroid Build Coastguard Worker   ese_close(&ese);
135*5c4dab75SAndroid Build Coastguard Worker   release_hardware(hw);
136*5c4dab75SAndroid Build Coastguard Worker   return 0;
137*5c4dab75SAndroid Build Coastguard Worker }
138