Check signed reply references against the revision envelope

This commit is contained in:
evgeny committed 2026-10-26 22:46:42 +01:00
1 parent e45f33e7b5
commit 8b34889a19
1 file changed
+12 -5
+12 -5
View File
@@ -71,15 +71,20 @@ private slots:
QCOMPARE(ed25519, QByteArray(reinterpret_cast<const char*>(inst->my_ed25519_pubkey), 32));
const auto reply = send("Answer", original); QCOMPARE(reply.size(), 32);
QCOMPARE(db.getMessageByKey(channel, reply).replyTo, original);
const auto sql = QString("SELECT timestamp,data,author_signature FROM msg_%1 WHERE message_id=?").arg(channel).toUtf8();
const auto sql = QString("SELECT timestamp,data,author_signature,nonce,ver,edited_at FROM msg_%1 WHERE message_id=?").arg(channel).toUtf8();
sqlite3_stmt* statement = nullptr;
QCOMPARE(sqlite3_prepare_v2(inst->topo_sqlite_db, sql.constData(), -1, &statement, nullptr), SQLITE_OK);
sqlite3_bind_blob(statement, 1, reply.constData(), reply.size(), SQLITE_STATIC);
QCOMPARE(sqlite3_step(statement), SQLITE_ROW);
uint64_t ts = sqlite3_column_int64(statement, 0);
QByteArray body(reinterpret_cast<const char*>(&ts), 8); body += DbManager::colBlob(statement, 1);
QByteArray signature = DbManager::colBlob(statement, 2); sqlite3_finalize(statement);
QCOMPARE(sc_ed25519_verify(inst->my_ed25519_pubkey, (uint8_t*)body.data(), body.size(), (uint8_t*)signature.data()), SC_OK);
QByteArray body = DbManager::colBlob(statement, 1), signature = DbManager::colBlob(statement, 2);
db_message_revision revision{}; const auto nonce = DbManager::colBlob(statement, 3); QCOMPARE(nonce.size(), 16);
memcpy(revision.nonce, nonce.constData(), 16); revision.ver = sqlite3_column_int64(statement, 4);
revision.edited_at = sqlite3_column_int64(statement, 5); sqlite3_finalize(statement);
uint8_t expected[64];
QCOMPARE(db_sync_sign_message(channel.toULongLong(), ts, inst->node_id, &revision, body.constData(), body.size(),
inst->my_ed25519_privkey, expected), 0);
QCOMPARE(signature, QByteArray(reinterpret_cast<const char*>(expected), 64));
const auto byKey = db.getMessageByKey(channel, reply);
const auto latest = db.getMessages(channel, 1); QCOMPARE(latest.size(), 1);
const auto since = db.getMessagesSince(channel, byKey.id - 1); QCOMPARE(since.size(), 1);
@@ -96,7 +101,9 @@ private slots:
QVERIFY(row.isOutgoing); QVERIFY(row.localAttrs.isEmpty());
}
const int reference = body.indexOf(original.toHex()); QVERIFY(reference >= 0); body[reference] = body[reference] == 'a' ? 'b' : 'a';
QVERIFY(sc_ed25519_verify(inst->my_ed25519_pubkey, (uint8_t*)body.data(), body.size(), (uint8_t*)signature.data()) != SC_OK);
QCOMPARE(db_sync_sign_message(channel.toULongLong(), ts, inst->node_id, &revision, body.constData(), body.size(),
inst->my_ed25519_privkey, expected), 0);
QVERIFY(signature != QByteArray(reinterpret_cast<const char*>(expected), 64));
chat_service_stop(inst); QCOMPARE(chat_service_start(inst), 0);
QCOMPARE(db.getMessageByKey(channel, reply).replyTo, original);
sqlite3* reopened = nullptr;