summaryrefslogtreecommitdiff
path: root/receiver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'receiver.cpp')
-rw-r--r--receiver.cpp27
1 files changed, 14 insertions, 13 deletions
diff --git a/receiver.cpp b/receiver.cpp
index 9e622d9..a3a0dc9 100644
--- a/receiver.cpp
+++ b/receiver.cpp
@@ -131,6 +131,13 @@ public:
131 const uint8_t *payload = packet + GCM_IV_LENGTH + GCM_TAG_LENGTH; 131 const uint8_t *payload = packet + GCM_IV_LENGTH + GCM_TAG_LENGTH;
132 len -= GCM_IV_LENGTH + GCM_TAG_LENGTH; 132 len -= GCM_IV_LENGTH + GCM_TAG_LENGTH;
133 133
134 std::string ivs(packet, packet +GCM_IV_LENGTH);
135 if (_used_ivs.find(ivs) != _used_ivs.end()) {
136 std::cerr << "Error: Session " << std::hex << _session_id << " reused IV. Dropping packet" << std::endl;
137 return;
138 }
139 _used_ivs.insert(ivs);
140
134 // Create output file if it doesn't exist 141 // Create output file if it doesn't exist
135 if (_fd < 0) 142 if (_fd < 0)
136 _fd = ::open(_filename.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0755); 143 _fd = ::open(_filename.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0755);
@@ -168,16 +175,16 @@ public:
168 } 175 }
169 176
170private: 177private:
171 uint64_t _session_id; 178 uint64_t _session_id;
172 uint8_t _key[AES_KEY_LENGTH]; 179 uint8_t _key[AES_KEY_LENGTH];
173 int _fd = -1; 180 int _fd = -1;
174 time_t _last_access = 0; 181 time_t _last_access = 0;
175 std::string _filename; 182 std::string _filename;
176 mbedtls_gcm_context _ctx; 183 std::set<std::string> _used_ivs;
184 mbedtls_gcm_context _ctx;
177}; 185};
178 186
179std::map<uint64_t, std::unique_ptr<Session>> g_sessions; 187std::map<uint64_t, std::unique_ptr<Session>> g_sessions;
180std::set<std::string> g_used_ivs;
181 188
182static uint8_t hex2nyble(char c) 189static uint8_t hex2nyble(char c)
183{ 190{
@@ -286,12 +293,6 @@ int main() {
286 g_sessions[session_id] = std::make_unique<Session>(session_id, rsa_plain_text); 293 g_sessions[session_id] = std::make_unique<Session>(session_id, rsa_plain_text);
287 break; 294 break;
288 case 1: { 295 case 1: {
289 std::string sessid_iv(packet + 1, packet + 1 + SESSION_ID_LENGTH + GCM_IV_LENGTH);
290 if (g_used_ivs.find(sessid_iv) != g_used_ivs.end()) {
291 std::cerr << "Error: Session " << std::hex << session_id << " reused IV. Dropping packet" << std::endl;
292 break;
293 }
294 g_used_ivs.insert(sessid_iv);
295 if (session != g_sessions.end()) 296 if (session != g_sessions.end())
296 session->second->write_log(packet + 1 + SESSION_ID_LENGTH, len - 1 - SESSION_ID_LENGTH); 297 session->second->write_log(packet + 1 + SESSION_ID_LENGTH, len - 1 - SESSION_ID_LENGTH);
297 else 298 else