ca nmhuong teegris 1

 avatar
Huongnm
c_cpp
a month ago
4.0 kB
6
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