#include "client.h" #include "tlibc/string/StringBuilder.h" void ClientCredentials_free(ClientCredentials* cred){ if(cred == NULL) return; free(cred->username.data); free(cred->aes_key.data); free(cred); } Result(ClientCredentials*) ClientCredentials_create(str username, str password){ Deferral(8); ClientCredentials* cred = (ClientCredentials*)malloc(sizeof(ClientCredentials)); memset(cred, 0, sizeof(ClientCredentials)); 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); }