Add Protocol::SignedMessage::valid + tests

This commit is contained in:
2026-08-05 10:54:05 +03:00
parent f56a5102a9
commit dfe1edf706
3 changed files with 29 additions and 17 deletions
+1 -1
View File
@@ -19,7 +19,7 @@ struct SignedMessage {
std::string plaintext); std::string plaintext);
std::vector<uint8_t> serialize(); std::vector<uint8_t> serialize();
// bool valid(); bool valid(unsigned char pub_key[crypto_sign_PUBLICKEYBYTES]);
}; };
} // namespace Protocol } // namespace Protocol
+19 -1
View File
@@ -1,5 +1,5 @@
#include "sodium/crypto_sign_ed25519.h"
#include <chrono> #include <chrono>
#include <cstring>
#include <protocol/protocol.hxx> #include <protocol/protocol.hxx>
#include <sodium.h> #include <sodium.h>
@@ -39,4 +39,22 @@ std::vector<uint8_t> SignedMessage::serialize() {
return bytes; return bytes;
} }
bool SignedMessage::valid(unsigned char pub_key[crypto_sign_PUBLICKEYBYTES]) {
unsigned char pub_key_fingerprint[crypto_hash_sha256_BYTES];
crypto_hash_sha256(pub_key_fingerprint, pub_key,
crypto_sign_PUBLICKEYBYTES);
if (std::memcmp(pub_key_fingerprint, sender_key_fingerprint,
crypto_sign_PUBLICKEYBYTES) != 0) {
return false;
}
auto serialized_data = serialize();
if (crypto_sign_verify_detached(signature, serialized_data.data(),
serialized_data.size(), pub_key) != 0) {
return false;
}
return true;
}
} // namespace Protocol } // namespace Protocol
+9 -15
View File
@@ -11,32 +11,26 @@ TEST_CASE("SignedMessage", "[protocol]") {
crypto_sign_keypair(pub_key, priv_key); crypto_sign_keypair(pub_key, priv_key);
auto msg = Protocol::SignedMessage(pub_key, priv_key, "Hello, world!"); auto msg = Protocol::SignedMessage(pub_key, priv_key, "Hello, world!");
auto to_be_signed = msg.serialize();
SECTION("valid signed message") { SECTION("valid signed message") { REQUIRE(msg.valid(pub_key)); }
REQUIRE(
crypto_sign_verify_detached(msg.signature, to_be_signed.data(),
to_be_signed.size(), pub_key) == 0);
}
SECTION("tampered invalid signed message") { SECTION("tampered invalid signed message") {
// todo: use to msg.valid()
SECTION("plaintext") { SECTION("plaintext") {
msg.plaintext = "Hello, world111111"; msg.plaintext = "Hello, world111111";
to_be_signed = msg.serialize(); REQUIRE_FALSE(msg.valid(pub_key));
REQUIRE_FALSE(crypto_sign_verify_detached(
msg.signature, to_be_signed.data(),
to_be_signed.size(), pub_key) == 0);
} }
SECTION("timestamp") { SECTION("timestamp") {
msg.timestamp = std::chrono::system_clock::now() msg.timestamp = std::chrono::system_clock::now()
.time_since_epoch() .time_since_epoch()
.count(); .count();
to_be_signed = msg.serialize(); REQUIRE_FALSE(msg.valid(pub_key));
REQUIRE_FALSE(crypto_sign_verify_detached( }
msg.signature, to_be_signed.data(),
to_be_signed.size(), pub_key) == 0); SECTION("fingerprint") {
std::memset(msg.sender_key_fingerprint, 'H',
crypto_hash_sha256_BYTES);
REQUIRE_FALSE(msg.valid(pub_key));
} }
} }
} }