blob: 09a4c6d527cea4fbe8a79c44d61c545bd63b0534 [file] [log] [blame]
Jens Wiklanderf261a6d2017-11-09 16:45:51 +01001/*
2 * Copyright (c) 2017, Linaro Limited
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <compiler.h>
8#include <dirent.h>
9#include <err.h>
10#include <errno.h>
11#include <fnmatch.h>
12#include <inttypes.h>
13#include <pta_secstor_ta_mgmt.h>
14#include <stdbool.h>
15#include <stdint.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19#include <sys/stat.h>
20#include <sys/types.h>
21#include <tee_client_api.h>
22#include <unistd.h>
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010023
Jens Wiklanderf261a6d2017-11-09 16:45:51 +010024#include "install_ta.h"
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010025#include "xtest_helpers.h"
26#include "xtest_test.h"
Jens Wiklanderf261a6d2017-11-09 16:45:51 +010027
28static void *read_ta(const char *dname, const char *fname, size_t *size)
29{
30 char nbuf[PATH_MAX];
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010031 FILE *f = NULL;
32 void *buf = NULL;
33 size_t s = 0;
Jens Wiklanderf261a6d2017-11-09 16:45:51 +010034
35 if (dname)
36 snprintf(nbuf, sizeof(nbuf), "%s/%s", dname, fname);
37 else
38 snprintf(nbuf, sizeof(nbuf), "%s", fname);
39
40 f = fopen(nbuf, "rb");
41 if (!f)
42 err(1, "fopen(\"%s\")", nbuf);
43
44 if (fseek(f, 0, SEEK_END))
45 err(1, "fseek");
46
47 s = ftell(f);
48 rewind(f);
49
50 buf = malloc(s);
51 if (!buf)
52 err(1, "malloc(%zu)", s);
53
54 if (fread(buf, 1, s, f) != s)
55 err(1, "fread");
56
57 *size = s;
58 return buf;
59}
60
61static void install_ta(TEEC_Session *sess, void *buf, size_t blen)
62{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010063 TEEC_Result res = TEEC_ERROR_GENERIC;
64 uint32_t err_origin = 0;
65 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Jens Wiklanderf261a6d2017-11-09 16:45:51 +010066
Jens Wiklanderf261a6d2017-11-09 16:45:51 +010067 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
68 TEEC_NONE, TEEC_NONE);
69 op.params[0].tmpref.buffer = buf;
70 op.params[0].tmpref.size = blen;
71
72 res = TEEC_InvokeCommand(sess, PTA_SECSTOR_TA_MGMT_BOOTSTRAP, &op,
73 &err_origin);
74 if (res)
75 errx(1, "install_ta: TEEC_InvokeCommand: %#" PRIx32
76 " err_origin %#" PRIx32, res, err_origin);
77}
78
79static void install_file(TEEC_Session *sess, const char *dirname,
80 const char *filename)
81{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010082 void *ta = NULL;
83 size_t ta_size = 0;
Jens Wiklanderf261a6d2017-11-09 16:45:51 +010084
85 printf("Installing \"%s\"\n", filename);
86 ta = read_ta(dirname, filename, &ta_size);
87 install_ta(sess, ta, ta_size);
88 free(ta);
89}
90
91static void install_dir(TEEC_Session *sess, const char *dirname)
92{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010093 DIR *dirp = NULL;
Jens Wiklanderf261a6d2017-11-09 16:45:51 +010094
95 printf("Searching directory \"%s\" for TAs\n", dirname);
96 dirp = opendir(dirname);
97 if (!dirp)
98 err(1, "opendir(\"%s\")", dirname);
99
100 while (true) {
101 struct dirent *dent = readdir(dirp);
102
103 if (!dent)
104 break;
105
106 if (fnmatch("*.ta", dent->d_name, 0))
107 continue;
108
109 install_file(sess, dirname, dent->d_name);
110 }
111
112 closedir(dirp);
113}
114
115int install_ta_runner_cmd_parser(int argc, char *argv[])
116{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100117 TEEC_Result res = TEEC_ERROR_GENERIC;
118 uint32_t err_origin = 0;
Jens Wiklanderf261a6d2017-11-09 16:45:51 +0100119 TEEC_UUID uuid = PTA_SECSTOR_TA_MGMT_UUID;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100120 TEEC_Context ctx = { };
121 TEEC_Session sess = { };
122 int i = 0;
Jens Wiklanderf261a6d2017-11-09 16:45:51 +0100123
124 res = TEEC_InitializeContext(NULL, &ctx);
125 if (res)
126 errx(1, "TEEC_InitializeContext: %#" PRIx32, res);
127
128 res = TEEC_OpenSession(&ctx, &sess, &uuid, TEEC_LOGIN_PUBLIC, NULL,
129 NULL, &err_origin);
130 if (res)
131 errx(1, "TEEC_OpenSession: res %#" PRIx32 " err_orig %#" PRIx32,
132 res, err_origin);
133
134 for (i = 1; i < argc; i++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100135 struct stat sb = { };
Jens Wiklanderf261a6d2017-11-09 16:45:51 +0100136
137 if (stat(argv[i], &sb)) {
138 printf("Skipping \"%s\": %s", argv[i], strerror(errno));
139 continue;
140 }
141
142 if (S_ISDIR(sb.st_mode))
143 install_dir(&sess, argv[i]);
144 else if (S_ISREG(sb.st_mode))
145 install_file(&sess, NULL, argv[i]);
146 else
147 printf("Skipping unknown file type \"%s\", mode 0%o",
148 argv[i], sb.st_mode);
149 }
150
151 TEEC_CloseSession(&sess);
152 TEEC_FinalizeContext(&ctx);
153
154 printf("Installing TAs done\n");
155
156 return 0;
157}