Show local identities in the ssb app.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3964 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
2022-08-15 02:23:45 +00:00
parent 69991abbb4
commit 357d944a8d
9 changed files with 116 additions and 5 deletions

View File

@ -7,6 +7,9 @@
#include <base64c.h>
#include <sodium/crypto_hash_sha256.h>
#include <sodium/crypto_scalarmult.h>
#include <sodium/crypto_scalarmult_curve25519.h>
#include <sodium/crypto_secretbox.h>
#include <sodium/crypto_sign.h>
#include <sqlite3.h>
#include <stdlib.h>
@ -795,3 +798,57 @@ bool tf_ssb_db_identity_get_private_key(tf_ssb_t* ssb, const char* user, const c
}
return success;
}
static void _test_private(sqlite3* db, const uint8_t* private_key)
{
sqlite3_stmt* statement = NULL;
if (sqlite3_prepare(db, "SELECT content FROM messages WHERE content LIKE '\"%.box\"'", -1, &statement, NULL) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW)
{
uint8_t buffer[8192];
//printf("==> %s\n", sqlite3_column_text(statement, 0));
int r = base64c_decode(sqlite3_column_text(statement, 0) + 1, sqlite3_column_bytes(statement, 0) - strlen("\".box\""), buffer, sizeof(buffer));
if (r > 1)
{
uint8_t* nonce = buffer;
uint8_t* public_key = buffer + 24;
if (public_key + 32 < buffer + r)
{
uint8_t shared_secret[crypto_scalarmult_curve25519_SCALARBYTES];
if (crypto_scalarmult_curve25519(shared_secret, private_key, public_key) == 0)
{
for (uint8_t* p = public_key + 32; p < buffer + r + 49; p += 49)
{
uint8_t out[49];
if (crypto_secretbox_open_easy(out, p, 49, nonce, shared_secret) == 0)
{
printf("opened secret box!\n");
}
}
}
}
}
}
sqlite3_finalize(statement);
}
}
void tf_ssb_db_private(sqlite3* db)
{
sqlite3_stmt* statement = NULL;
if (sqlite3_prepare(db, "SELECT public_key, private_key FROM identities", -1, &statement, NULL) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW)
{
uint8_t private_key[crypto_sign_SECRETKEYBYTES];
printf("-> %s\n", sqlite3_column_text(statement, 0));
int r = base64c_decode(sqlite3_column_text(statement, 1), sqlite3_column_bytes(statement, 1) - strlen(".ed25519"), private_key, sizeof(private_key));
if (r > 0)
{
_test_private(db, private_key);
}
}
sqlite3_finalize(statement);
}
}