Optimize delete password from buffer
This commit is contained in:
parent
29cfc93580
commit
30a99f35a6
@ -30,7 +30,7 @@ enum class Arg
|
|||||||
|
|
||||||
int find_password_in_buffer(Buffer& buff, const char* label);
|
int find_password_in_buffer(Buffer& buff, const char* label);
|
||||||
|
|
||||||
void delete_password_from_buffer(Buffer& in, Buffer& out, int index_of_pass);
|
void delete_password_from_buffer(Buffer& in, int index_of_pass);
|
||||||
|
|
||||||
void add_password_to_buffer(Buffer& in, const char* label, const char* password);
|
void add_password_to_buffer(Buffer& in, const char* label, const char* password);
|
||||||
|
|
||||||
|
@ -20,61 +20,26 @@ const char*arg_get(Buffer& decrypted_buffer, const char* label)
|
|||||||
|
|
||||||
const char* arg_generate(Buffer& decrypted_buffer, Buffer& encrypted_buffer, const char* label, Cryptography& crypto)
|
const char* arg_generate(Buffer& decrypted_buffer, Buffer& encrypted_buffer, const char* label, Cryptography& crypto)
|
||||||
{
|
{
|
||||||
if (decrypted_buffer.taken < 8) {
|
|
||||||
Index index = { 0, 0 };
|
|
||||||
index.offset = sizeof(Index);
|
|
||||||
decrypted_buffer.add_end((uint8_t*)&index, sizeof(Index));
|
|
||||||
}
|
|
||||||
|
|
||||||
printf_s("Generating password for %s\n", label);
|
printf_s("Generating password for %s\n", label);
|
||||||
|
|
||||||
int pass = find_password_in_buffer(decrypted_buffer, label);
|
|
||||||
|
|
||||||
std::string password;
|
std::string password;
|
||||||
|
|
||||||
generate_password(password, 15);
|
generate_password(password, 15);
|
||||||
|
|
||||||
|
int pass = find_password_in_buffer(decrypted_buffer, label);
|
||||||
|
if (pass >= 0) delete_password_from_buffer(decrypted_buffer, pass);
|
||||||
|
|
||||||
if (pass < 0)
|
add_password_to_buffer(decrypted_buffer, label, password.c_str());
|
||||||
{
|
crypto.encrypt(&decrypted_buffer, &encrypted_buffer);
|
||||||
add_password_to_buffer(decrypted_buffer, label, password.c_str());
|
save_buffer_to_file(encrypted_buffer);
|
||||||
crypto.encrypt(&decrypted_buffer, &encrypted_buffer);
|
Index* index = (Index*)decrypted_buffer.buffer;
|
||||||
save_buffer_to_file(encrypted_buffer);
|
return get_password_from_buffer(decrypted_buffer, index->count - 1);
|
||||||
|
|
||||||
Index* index = (Index*)decrypted_buffer.buffer;
|
|
||||||
|
|
||||||
return get_password_from_buffer(decrypted_buffer, index->count - 1);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
delete_password_from_buffer(decrypted_buffer, encrypted_buffer, pass);
|
|
||||||
add_password_to_buffer(encrypted_buffer, label, password.c_str());
|
|
||||||
crypto.encrypt(&encrypted_buffer, &decrypted_buffer);
|
|
||||||
save_buffer_to_file(decrypted_buffer);
|
|
||||||
|
|
||||||
Index* index = (Index*)encrypted_buffer.buffer;
|
|
||||||
|
|
||||||
return get_password_from_buffer(encrypted_buffer, index->count - 1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* arg_input(Buffer& decrypted_buffer, Buffer& encrypted_buffer, const char* label, Cryptography& crypto)
|
const char* arg_input(Buffer& decrypted_buffer, Buffer& encrypted_buffer, const char* label, Cryptography& crypto)
|
||||||
{
|
{
|
||||||
if (decrypted_buffer.taken < 8) {
|
|
||||||
Index index = { 0, 0 };
|
|
||||||
index.offset = sizeof(Index);
|
|
||||||
decrypted_buffer.add_end((uint8_t*)&index, sizeof(Index));
|
|
||||||
}
|
|
||||||
|
|
||||||
printf_s("Input password for %s:", label);
|
printf_s("Input password for %s:", label);
|
||||||
|
|
||||||
std::string new_string = get_user_password();
|
std::string new_string = get_user_password();
|
||||||
|
|
||||||
if (new_string.empty())
|
if (new_string.empty())
|
||||||
{
|
{
|
||||||
printf_s("error getting password\n");
|
printf_s("error getting password\n");
|
||||||
@ -82,34 +47,13 @@ const char* arg_input(Buffer& decrypted_buffer, Buffer& encrypted_buffer, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
int pass = find_password_in_buffer(decrypted_buffer, label);
|
int pass = find_password_in_buffer(decrypted_buffer, label);
|
||||||
|
if (pass >= 0) delete_password_from_buffer(decrypted_buffer, pass);
|
||||||
|
|
||||||
if (pass < 0)
|
add_password_to_buffer(decrypted_buffer, label, new_string.c_str());
|
||||||
{
|
crypto.encrypt(&decrypted_buffer, &encrypted_buffer);
|
||||||
add_password_to_buffer(decrypted_buffer, label, new_string.c_str());
|
save_buffer_to_file(encrypted_buffer);
|
||||||
crypto.encrypt(&decrypted_buffer, &encrypted_buffer);
|
Index* index = (Index*)decrypted_buffer.buffer;
|
||||||
save_buffer_to_file(encrypted_buffer);
|
return get_password_from_buffer(decrypted_buffer, index->count - 1);
|
||||||
|
|
||||||
Index* index = (Index*)decrypted_buffer.buffer;
|
|
||||||
|
|
||||||
return get_password_from_buffer(decrypted_buffer, index->count - 1);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
delete_password_from_buffer(decrypted_buffer, encrypted_buffer, pass);
|
|
||||||
add_password_to_buffer(encrypted_buffer, label, new_string.c_str());
|
|
||||||
|
|
||||||
crypto.encrypt(&encrypted_buffer, &decrypted_buffer);
|
|
||||||
save_buffer_to_file(decrypted_buffer);
|
|
||||||
|
|
||||||
Index* index = (Index*)encrypted_buffer.buffer;
|
|
||||||
|
|
||||||
return get_password_from_buffer(encrypted_buffer, index->count - 1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void arg_list(Buffer& decrypted_buffer)
|
void arg_list(Buffer& decrypted_buffer)
|
||||||
@ -133,10 +77,10 @@ void arg_delete(Buffer& in_buffer, Buffer& out_buffer, const char* label_to_del,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete_password_from_buffer(in_buffer, out_buffer, pass);
|
delete_password_from_buffer(in_buffer, pass);
|
||||||
|
|
||||||
crypto.encrypt(&out_buffer, &in_buffer);
|
crypto.encrypt(&in_buffer, &out_buffer);
|
||||||
save_buffer_to_file(in_buffer);
|
save_buffer_to_file(out_buffer);
|
||||||
printf_s("Password deleted\n");
|
printf_s("Password deleted\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,36 +16,27 @@ int find_password_in_buffer(Buffer& decrypted_buffer, const char* label)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void delete_password_from_buffer(Buffer& in, Buffer& out, int index_of_pass)
|
void delete_password_from_buffer(Buffer& in, int index_of_pass)
|
||||||
{
|
{
|
||||||
Index* in_index = (Index*)in.buffer;
|
Index* in_index = (Index*)in.buffer;
|
||||||
Pass* in_pass = (Pass*)(in.buffer + sizeof(Index));
|
Pass* in_pass = (Pass*)(in.buffer + sizeof(Index));
|
||||||
|
|
||||||
int size = sizeof(Index) + sizeof(Pass) * (in_index->count - 1);
|
int size_of_label = strlen((char*)in.buffer + in_pass[index_of_pass].label + in_index->offset) + 1;
|
||||||
out.resize(size);
|
int size_of_password = strlen((char*)in.buffer + in_pass[index_of_pass].password + in_index->offset) + 1;
|
||||||
out.taken = size;
|
int size_pass = size_of_label + size_of_password;
|
||||||
|
|
||||||
Index* out_index = (Index*)out.buffer;
|
uint8_t* start_of_pass = in.buffer + in_pass[index_of_pass].label + in_index->offset;
|
||||||
out_index->count = in_index->count - 1;
|
in.remove_fast(start_of_pass, size_pass);
|
||||||
out_index->offset = size;
|
|
||||||
|
|
||||||
|
for (size_t i = index_of_pass; i < in_index->count; i++)
|
||||||
int count = 0;
|
|
||||||
for (size_t i = 0; i < in_index->count; i++)
|
|
||||||
{
|
{
|
||||||
if (i == index_of_pass) continue;
|
in_pass[i].label -= size_pass;
|
||||||
|
in_pass[i].password -= size_pass;
|
||||||
uint8_t* label = in.buffer + in_pass[i].label + in_index->offset;
|
|
||||||
uint8_t* password = in.buffer + in_pass[i].password + in_index->offset;
|
|
||||||
|
|
||||||
size_t label_start = out.add_end(label, strlen((char*)label) + 1);
|
|
||||||
size_t password_start = out.add_end(password, strlen((char*)password) + 1);
|
|
||||||
|
|
||||||
Pass* out_pass = (Pass*)(out.buffer + sizeof(Index));
|
|
||||||
out_pass[count].label = label_start - size;
|
|
||||||
out_pass[count].password = password_start - size;
|
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
in.remove_fast((uint8_t*)& in_pass[index_of_pass], sizeof(Pass));
|
||||||
|
in_index->count -= 1;
|
||||||
|
in_index->offset -= sizeof(Pass);
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_password_to_buffer(Buffer& in, const char* label, const char* password)
|
void add_password_to_buffer(Buffer& in, const char* label, const char* password)
|
||||||
@ -78,7 +69,7 @@ void generate_password(std::string& password, int len)
|
|||||||
char characters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$%^&*()_-+={[}]|:;<,>.?";
|
char characters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$%^&*()_-+={[}]|:;<,>.?";
|
||||||
for (int i = 0; i < len; i++)
|
for (int i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
password[i] += characters[rand() % (sizeof(characters) - 1)];
|
password += characters[rand() % (sizeof(characters) - 1)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,13 +23,18 @@ int main()
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string user_pass = "123";
|
std::string user_pass = "123";
|
||||||
Cryptography crypto(user_pass.c_str(), user_pass.size());
|
Cryptography crypto(user_pass.c_str(), user_pass.size());
|
||||||
Buffer decrypted_buffer;
|
Buffer decrypted_buffer;
|
||||||
if (encrypted_buffer.size > 0)
|
if (encrypted_buffer.size > 0)
|
||||||
if (!crypto.decrypt(&encrypted_buffer, &decrypted_buffer)) return 1;
|
if (!crypto.decrypt(&encrypted_buffer, &decrypted_buffer)) return 1;
|
||||||
|
|
||||||
|
if (decrypted_buffer.taken < 8) {
|
||||||
|
Index index = { 0, 0 };
|
||||||
|
index.offset = sizeof(Index);
|
||||||
|
decrypted_buffer.add_end((uint8_t*)&index, sizeof(Index));
|
||||||
|
}
|
||||||
|
|
||||||
const char* pass = nullptr;
|
const char* pass = nullptr;
|
||||||
|
|
||||||
switch (args)
|
switch (args)
|
||||||
@ -103,6 +108,12 @@ int main(int argc, char** argv)
|
|||||||
if (encrypted_buffer.size > 0)
|
if (encrypted_buffer.size > 0)
|
||||||
if (!crypto.decrypt(&encrypted_buffer, &decrypted_buffer)) return 1;
|
if (!crypto.decrypt(&encrypted_buffer, &decrypted_buffer)) return 1;
|
||||||
|
|
||||||
|
if (decrypted_buffer.taken < 8) {
|
||||||
|
Index index = { 0, 0 };
|
||||||
|
index.offset = sizeof(Index);
|
||||||
|
decrypted_buffer.add_end((uint8_t*)&index, sizeof(Index));
|
||||||
|
}
|
||||||
|
|
||||||
const char* pass = nullptr;
|
const char* pass = nullptr;
|
||||||
|
|
||||||
switch (args)
|
switch (args)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user