diff options
author | Dirk Engling <erdgeist@erdgeist.org> | 2020-12-05 13:12:09 +0100 |
---|---|---|
committer | Dirk Engling <erdgeist@erdgeist.org> | 2020-12-05 13:12:09 +0100 |
commit | 8e4cbe717397f38bd479a2dbe327adb5ae0baef8 (patch) | |
tree | 0ded7f6be7f4184e5d1464ab6f41a86a10239c68 /receiver.cpp | |
parent | 5b369d672e35d95740dd3d24f8d69ea08fb7741c (diff) |
Make iv history session local
Diffstat (limited to 'receiver.cpp')
-rw-r--r-- | receiver.cpp | 27 |
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 | ||
170 | private: | 177 | private: |
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 | ||
179 | std::map<uint64_t, std::unique_ptr<Session>> g_sessions; | 187 | std::map<uint64_t, std::unique_ptr<Session>> g_sessions; |
180 | std::set<std::string> g_used_ivs; | ||
181 | 188 | ||
182 | static uint8_t hex2nyble(char c) | 189 | static 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 |