ca nmhuong teegris 1
Huongnm
c_cpp
a month ago
4.0 kB
7
Indexable
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <tee_client_api.h>
#define TA_CREDENTIAL_CMD_WRITE 0
#define TA_CREDENTIAL_CMD_LIST 1
#define TA_CREDENTIAL_CMD_READ 2
static const TEEC_UUID uuid1 = {
.timeLow = 0xf4e750bb,
.timeMid = 0x1437,
.timeHiAndVersion = 0x4fbf,
.clockSeqAndNode = { 0x87, 0x85, 0x8d, 0x35, 0x80, 0xc3, 0x49, 0x94 },
};
TEEC_Context ctx;
TEEC_Session sess;
void init_tee() {
TEEC_UUID uuid = uuid1;
uint32_t err_origin;
TEEC_Result res = TEEC_InitializeContext(NULL, &ctx);
if (res != TEEC_SUCCESS) errx(1, "TEEC_InitializeContext failed 0x%x", res);
res = TEEC_OpenSession(&ctx, &sess, &uuid, TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
if (res != TEEC_SUCCESS) errx(1, "TEEC_Opensession failed 0x%x origin 0x%x", res, err_origin);
}
void finalize_tee() {
TEEC_CloseSession(&sess);
TEEC_FinalizeContext(&ctx);
}
void handle_save(const char *appid, const char *user, const char *pass) {
TEEC_Operation op = {0};
uint32_t origin;
op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_MEMREF_TEMP_INPUT,
TEEC_MEMREF_TEMP_INPUT, TEEC_NONE);
op.params[0].tmpref.buffer = (void *)appid;
op.params[0].tmpref.size = strlen(appid);
op.params[1].tmpref.buffer = (void *)user;
op.params[1].tmpref.size = strlen(user);
op.params[2].tmpref.buffer = (void *)pass;
op.params[2].tmpref.size = strlen(pass);
TEEC_Result res = TEEC_InvokeCommand(&sess, TA_CREDENTIAL_CMD_WRITE, &op, &origin);
if (res == TEEC_SUCCESS) printf("SUCCESS: Account saved for %s/%s\n", appid, user);
else printf("ERROR: Failed to save (0x%x)\n", res);
}
void handle_list(const char *appid) {
TEEC_Operation op = {0};
uint32_t origin;
char list[512] = {0};
op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_MEMREF_TEMP_OUTPUT,
TEEC_NONE, TEEC_NONE);
op.params[0].tmpref.buffer = (void *)appid;
op.params[0].tmpref.size = strlen(appid);
op.params[1].tmpref.buffer = list;
op.params[1].tmpref.size = sizeof(list);
TEEC_Result res = TEEC_InvokeCommand(&sess, TA_CREDENTIAL_CMD_LIST, &op, &origin);
if (res == TEEC_SUCCESS) {
printf("Found accounts for %s: %s\n", appid, list);
} else printf("ERROR: Failed to list (0x%x)\n", res);
}
void handle_read(const char *appid, const char *user) {
TEEC_Operation op = {0};
uint32_t origin;
char pass[64] = {0};
op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_MEMREF_TEMP_INPUT,
TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
op.params[0].tmpref.buffer = (void *)appid;
op.params[0].tmpref.size = strlen(appid);
op.params[1].tmpref.buffer = (void *)user;
op.params[1].tmpref.size = strlen(user);
op.params[2].tmpref.buffer = pass;
op.params[2].tmpref.size = sizeof(pass);
TEEC_Result res = TEEC_InvokeCommand(&sess, TA_CREDENTIAL_CMD_READ, &op, &origin);
if (res == TEEC_SUCCESS) {
printf("Password for %s/%s is: %s\n", appid, user, pass);
} else printf("ERROR: Failed to read (0x%x)\n", res);
}
void print_usage() {
printf("Usage:\n");
printf(" save [appid] [user] [pass]\n");
printf(" list [appid]\n");
printf(" read [appid] [user]\n");
}
int main(int argc, char *argv[]) {
if (argc < 2) {
print_usage();
return 1;
}
init_tee();
if (strcmp(argv[1], "save") == 0 && argc == 5) {
handle_save(argv[2], argv[3], argv[4]);
}
else if (strcmp(argv[1], "list") == 0 && argc == 3) {
handle_list(argv[2]);
}
else if (strcmp(argv[1], "read") == 0 && argc == 4) {
handle_read(argv[2], argv[3]);
}
else {
print_usage();
}
finalize_tee();
return 0;
}Editor is loading...
Leave a Comment