ca hashpass
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