50 lines
1.5 KiB
C
50 lines
1.5 KiB
C
#include "client.h"
|
|
#include "tlibc/string/StringBuilder.h"
|
|
|
|
void ClientCredential_free(ClientCredential* cred){
|
|
if(cred == NULL)
|
|
return;
|
|
free(cred->username.data);
|
|
free(cred->aes_key.data);
|
|
free(cred);
|
|
}
|
|
|
|
|
|
Result(ClientCredential*) ClientCredential_create(str username, str password){
|
|
Deferral(8);
|
|
ClientCredential* cred = (ClientCredential*)malloc(sizeof(ClientCredential));
|
|
memset(cred, 0, sizeof(ClientCredential));
|
|
bool success = false;
|
|
Defer(
|
|
if(!success)
|
|
free(cred);
|
|
);
|
|
|
|
cred->username = str_copy(username);
|
|
Defer(
|
|
if(!success)
|
|
free(cred->username.data);
|
|
);
|
|
|
|
// concat password and username
|
|
StringBuilder sb = StringBuilder_alloc(username.size + password.size + 1);
|
|
Defer(StringBuilder_destroy(&sb));
|
|
StringBuilder_append_str(&sb, password);
|
|
StringBuilder_append_str(&sb, username);
|
|
Array(u8) password_and_username = str_castTo_Array(StringBuilder_getStr(&sb));
|
|
cred->aes_key = Array_alloc(u8, PASSWORD_HASH_SIZE);
|
|
Defer(
|
|
if(!success){
|
|
free(cred->aes_key.data);
|
|
}
|
|
);
|
|
// lvl 1 hash - is used as AES key for user data
|
|
hash_password(password_and_username, cred->aes_key.data, __PASSWORD_HASH_LVL_ITERATIONS);
|
|
|
|
AESBlockEncryptor_construct(&cred->user_data_aes_enc, cred->aes_key, AESBlockEncryptor_DEFAULT_CLASS);
|
|
AESBlockDecryptor_construct(&cred->user_data_aes_dec, cred->aes_key, AESBlockDecryptor_DEFAULT_CLASS);
|
|
|
|
success = true;
|
|
Return RESULT_VALUE(p, cred);
|
|
}
|