ca hashpass

 avatar
Huongnm
c_cpp
23 days ago
4.9 kB
6
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tee_client_api.h>

static const TEEC_UUID uuid = {
    .timeLow = 0x3f2b1a67,
    .timeMid = 0xbb77,
    .timeHiAndVersion = 0x407f,
    .clockSeqAndNode = {0xaa, 0x64, 0x05, 0x22, 0x92, 0x03, 0x2b, 0x6f},
};

#define CMD_SAVE_PASSWORD		1
#define CMD_CALL_PASSWORD		2
#define CMD_INIT_MASTER			3
#define CMD_VERIFY_MASTER		4

#define MAX_SIZE 64

typedef struct 
{
	char package_name[MAX_SIZE];
	char user_id[MAX_SIZE];
	char password[MAX_SIZE];
} PasswordEntry;

int main(int argc, char *argv[]){
	if(argc < 2) return 1;

	TEEC_Context context;
    TEEC_Session session;
	TEEC_Operation operation = {0};
    uint32_t returnOrigin;
	TEEC_SharedMemory smem = {0};

    TEEC_Result res = TEEC_InitializeContext(NULL, &context);

    if (res != TEEC_SUCCESS) {
        fprintf(stderr, "InitializeContext failed: %x\n", res);
        return 1;
    }TEEC_Context context;
    TEEC_Session session;
	TEEC_Operation operation = {0};
    uint32_t returnOrigin;
	TEEC_SharedMemory smem = {0};

    TEEC_Result res = TEEC_InitializeContext(NULL, &context);
    if (res != TEEC_SUCCESS) {
        fprintf(stderr, "InitializeContext failed: %x\n", res);
        return 1;
    }

    res = TEEC_OpenSession(&context, &session, &uuid, TEEC_LOGIN_PUBLIC, NULL, NULL, &returnOrigin);
    if (res != TEEC_SUCCESS) {
        fprintf(stderr, "TEEC_OpenSession returned %x\n", res);
        goto finalize_context;
    }

	// Cấp phát shared memory (dùng chung cho cả PasswordEntry và Hash để tiết kiệm tài nguyên)
	smem.size = sizeof(PasswordEntry); // Kích thước này đủ lớn để chứa cả Master Hash (64 byte)
	smem.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT;
	TEEC_AllocateSharedMemory(&context, &smem);

	memset(smem.buffer, 0, smem.size);

	operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT,
                                            TEEC_NONE,
                                            TEEC_NONE,
                                            TEEC_NONE);
	operation.params[0].memref.parent = &smem;
	operation.params[0].memref.size = smem.size;

	if (strcmp(argv[1], "init_master") == 0 && argc == 3) {
		// command: ./ca init_master [hash]
		strncpy((char*)smem.buffer, argv[2], MAX_SIZE - 1);
		res = TEEC_InvokeCommand(&session, CMD_INIT_MASTER, &operation, &returnOrigin);
		if(res == TEEC_SUCCESS) {
			printf("Master Password initialized successfully!\n");
		} else {
            printf("Init failed: 0x%x\n", res);
        }
	} 
    else if (strcmp(argv[1], "verify_and_get") == 0 && argc == 5) {
        // command: ./ca verify_and_get [hash] [package_name] [userId]
        
        // BƯỚC 1: XÁC THỰC
        strncpy((char*)smem.buffer, argv[2], MAX_SIZE - 1); // Đưa hash vào buffer
        operation.params[0].memref.size = MAX_SIZE; // Set lại size cho hàm verify

        res = TEEC_InvokeCommand(&session, CMD_VERIFY_MASTER, &operation, &returnOrigin);
        
        if (res == TEEC_SUCCESS) {
            // Xác thực thành công trong Session này. 
            // TA đã đánh dấu Session hiện tại là `is_authenticated = 1`
            
            // BƯỚC 2: LẤY MẬT KHẨU (trong CÙNG MỘT SESSION)
            PasswordEntry *entry = (PasswordEntry *)smem.buffer;
            memset(entry, 0, sizeof(PasswordEntry)); // Xóa Hash khỏi buffer
            strncpy(entry->package_name, argv[3], MAX_SIZE - 1);
            strncpy(entry->user_id, argv[4], MAX_SIZE - 1);
            operation.params[0].memref.size = sizeof(PasswordEntry);

            res = TEEC_InvokeCommand(&session, CMD_CALL_PASSWORD, &operation, &returnOrigin); 
            if(res == TEEC_SUCCESS){
                printf("%s\n", entry->password);
            } else {
                printf("get password failed (error: 0x%x)\n", res);
            }
        } else {
            printf("Authentication failed! Access Denied.\n");
        }
    }

	if(strcmp(argv[1], "save") == 0 && argc == 5) {
		// command: ./ca save [package_name] [userId] [pass]
		strncpy(entry->package_name, argv[2], MAX_SIZE - 1);
		strncpy(entry->user_id, argv[3], MAX_SIZE - 1);

		strncpy(entry->password, argv[4], MAX_SIZE - 1);

		res = TEEC_InvokeCommand(&session, CMD_SAVE_PASSWORD, &operation, &returnOrigin);
		if(res == TEEC_SUCCESS) {
				printf("save success\n");
		}
	} else if(strcmp(argv[1], "get") == 0 && argc == 4) {
		// command: ./ca get [package_name] [userId]
		strncpy(entry->package_name, argv[2], MAX_SIZE - 1);
		strncpy(entry->user_id, argv[3], MAX_SIZE - 1);
		
		res = TEEC_InvokeCommand(&session, CMD_CALL_PASSWORD, &operation, &returnOrigin); 
		if(res == TEEC_SUCCESS){
			printf("%s\n", entry->password);
		} else {
			printf("get fail\n");
		}
	} 

	TEEC_ReleaseSharedMemory(&smem);
    TEEC_CloseSession(&session);
finalize_context:
    TEEC_FinalizeContext(&context);
    return (res != TEEC_SUCCESS);
}
Editor is loading...
Leave a Comment