From 8b34889a1966f74953ece5d34dea21110ca27273 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 26 Oct 2026 22:46:42 +0100 Subject: [PATCH] Check signed reply references against the revision envelope --- tools/chatgui/tests/test_channel_replies.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tools/chatgui/tests/test_channel_replies.cpp b/tools/chatgui/tests/test_channel_replies.cpp index c8e149bb..e417b2e8 100644 --- a/tools/chatgui/tests/test_channel_replies.cpp +++ b/tools/chatgui/tests/test_channel_replies.cpp @@ -71,15 +71,20 @@ private slots: QCOMPARE(ed25519, QByteArray(reinterpret_cast(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(&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(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(expected), 64)); chat_service_stop(inst); QCOMPARE(chat_service_start(inst), 0); QCOMPARE(db.getMessageByKey(channel, reply).replyTo, original); sqlite3* reopened = nullptr;