From 19a18bbf37cb129b411c838810e6f8e5b2e556fc Mon Sep 17 00:00:00 2001 From: nikhilsamrat Date: Thu, 10 Feb 2022 12:48:29 +0530 Subject: [PATCH] added address to msg_log --- .../multicast/DefaultMulticastClient.hpp | 6 +- pubsub/include/marlin/pubsub/PubSubNode.hpp | 98 ++++++++++--------- .../marlin/pubsub/attestation/SigAttester.hpp | 55 +++++++++-- 3 files changed, 105 insertions(+), 54 deletions(-) diff --git a/multicastsdk/include/marlin/multicast/DefaultMulticastClient.hpp b/multicastsdk/include/marlin/multicast/DefaultMulticastClient.hpp index 966f401d..a2c99475 100644 --- a/multicastsdk/include/marlin/multicast/DefaultMulticastClient.hpp +++ b/multicastsdk/include/marlin/multicast/DefaultMulticastClient.hpp @@ -110,13 +110,15 @@ class DefaultMulticastClient { void msg_log( core::SocketAddress taddr, typename PubSubNodeType::ClientKey baddr, + std::array address, uint64_t message_id, core::WeakBuffer message ) { if((message_id & LogMask::mask(message)) == 0) { SPDLOG_INFO( - "Msg log: {}, cluster: 0x{:spn}, relay: {}", - message_id, spdlog::to_hex(baddr.data(), baddr.data()+baddr.size()), taddr.to_string() + "Msg log: {}, cluster: 0x{:spn}, relay: {}, sender: 0x{:spn}", + message_id, spdlog::to_hex(baddr.data(), baddr.data()+baddr.size()), taddr.to_string(), + spdlog::to_hex(address.data(), address.data()+20) ); } } diff --git a/pubsub/include/marlin/pubsub/PubSubNode.hpp b/pubsub/include/marlin/pubsub/PubSubNode.hpp index 530d2835..0db931e1 100755 --- a/pubsub/include/marlin/pubsub/PubSubNode.hpp +++ b/pubsub/include/marlin/pubsub/PubSubNode.hpp @@ -972,60 +972,64 @@ int PUBSUBNODETYPE::did_recv_MESSAGE( SPDLOG_DEBUG("PUBSUBNODE did_recv_MESSAGE ### message id: {}, channel: {}", message_id, channel); - constexpr bool has_msg_log = requires( - PubSubDelegate& d - ) { - d.msg_log(core::SocketAddress(), std::array(), message_id, bytes); - }; - if constexpr(has_msg_log) { - delegate->msg_log(transport.dst_addr, beacon_map[transport.dst_addr], message_id, bytes); + bytes.cover_unsafe(10); + MessageHeaderType header = {}; + + auto att_opt = attester.parse_size(bytes, 0); + if(!att_opt.has_value()) { + SPDLOG_ERROR("Attestation size parse failure"); + transport.close(); + return -1; } - // Send it onward - if(message_id_set.find(message_id) == message_id_set.end()) { // Deduplicate message - bytes.cover_unsafe(10); - MessageHeaderType header = {}; + header.attestation_data = bytes.data(); + header.attestation_size = att_opt.value(); + auto res = bytes.cover(header.attestation_size); - auto att_opt = attester.parse_size(bytes, 0); - if(!att_opt.has_value()) { - SPDLOG_ERROR("Attestation size parse failure"); - transport.close(); - return -1; - } + if(!res) { + SPDLOG_ERROR("Attestation too long: {}", header.attestation_size); + transport.close(); + return -1; + } - header.attestation_data = bytes.data(); - header.attestation_size = att_opt.value(); - auto res = bytes.cover(header.attestation_size); + auto wit_opt = witnesser.parse_size(bytes, 0); + if(!wit_opt.has_value()) { + SPDLOG_ERROR("Witness size parse failure"); + transport.close(); + return -1; + } - if(!res) { - SPDLOG_ERROR("Attestation too long: {}", header.attestation_size); - transport.close(); - return -1; - } + header.witness_data = bytes.data(); + header.witness_size = wit_opt.value(); + res = bytes.cover(header.witness_size); - auto wit_opt = witnesser.parse_size(bytes, 0); - if(!wit_opt.has_value()) { - SPDLOG_ERROR("Witness size parse failure"); - transport.close(); - return -1; - } + if(!res) { + SPDLOG_ERROR("Witness too long: {}", header.witness_size); + transport.close(); + return -1; + } - header.witness_data = bytes.data(); - header.witness_size = wit_opt.value(); - res = bytes.cover(header.witness_size); + bool verify; + std::array address; + std::tie(verify, address) = attester.verify(message_id, channel, bytes.data(), bytes.size(), header); - if(!res) { - SPDLOG_ERROR("Witness too long: {}", header.witness_size); - transport.close(); - return -1; - } + if(!verify) { + SPDLOG_ERROR("Attestation verification failed"); + transport.close(); + return -1; + } - if(!attester.verify(message_id, channel, bytes.data(), bytes.size(), header)) { - SPDLOG_ERROR("Attestation verification failed"); - transport.close(); - return -1; - } + constexpr bool has_msg_log = requires( + PubSubDelegate& d + ) { + d.msg_log(core::SocketAddress(), std::array(), std::array(), message_id, bytes); + }; + if constexpr(has_msg_log) { + delegate->msg_log(transport.dst_addr, beacon_map[transport.dst_addr], address, message_id, bytes); + } + // Send it onward + if(message_id_set.find(message_id) == message_id_set.end()) { // Deduplicate message message_id_set.insert(message_id); message_id_events[message_id_idx].push_back(message_id); @@ -1853,7 +1857,11 @@ int PUBSUBNODETYPE::cut_through_recv_bytes( spdlog::to_hex(header.witness_data, header.witness_data + header.witness_size) ); - if(!attester.verify(message_id, channel, bytes.data() + offset, bytes.size() - offset, header)) { + bool verify; + std::array address; + std::tie(verify, address) = attester.verify(message_id, channel, bytes.data() + offset, bytes.size() - offset, header); + + if(!verify) { SPDLOG_ERROR("Attestation verification failed"); transport.close(); return -1; diff --git a/pubsub/include/marlin/pubsub/attestation/SigAttester.hpp b/pubsub/include/marlin/pubsub/attestation/SigAttester.hpp index a278edc7..3137f473 100644 --- a/pubsub/include/marlin/pubsub/attestation/SigAttester.hpp +++ b/pubsub/include/marlin/pubsub/attestation/SigAttester.hpp @@ -101,14 +101,55 @@ struct SigAttester { } template - bool verify( - uint64_t, - uint16_t, - uint8_t const*, - uint64_t, - HeaderType + std::tuple> verify( + uint64_t message_id, + uint16_t channel, + uint8_t const* message_data, + uint64_t message_size, + HeaderType prev_header ) { - return true; + uint8_t hash[32]; + CryptoPP::Keccak_256 hasher; + // Hash message + hasher.CalculateTruncatedDigest(hash, 32, message_data, message_size); + + secp256k1_ecdsa_recoverable_signature sig; + + // Parse signature + secp256k1_ecdsa_recoverable_signature_parse_compact( + ctx_verifier, + &sig, + prev_header.attestation_data + 2, + prev_header.attestation_data[66] + ); + + // Verify signature + std::array address; + secp256k1_pubkey pubkey; + { + auto res = secp256k1_ecdsa_recover( + ctx_verifier, + &pubkey, + &sig, + hash + ); + + if(res == 0) { + // Recovery failed + return make_tuple(false, address); + } + } + + // Get address + hasher.CalculateTruncatedDigest(hash, 32, pubkey.data, 64); + // address is in hash[12..31] + for(int i=0;i<20;i++){ + address[i] = hash[i+12]; + } + + //SPDLOG_INFO("pubkey: {}", spdlog::to_hex(pubkey.data, pubkey.data+64)); + + return make_tuple(true, address); } std::optional parse_size(core::Buffer& buf, uint64_t offset = 0) {