diff options
| author | Dirk Engling <erdgeist@erdgeist.org> | 2021-01-17 01:12:38 +0100 | 
|---|---|---|
| committer | Dirk Engling <erdgeist@erdgeist.org> | 2021-01-17 01:12:38 +0100 | 
| commit | aab88fa8ebd9af971c1fc9e2f81b9cd9db538f90 (patch) | |
| tree | a7c18ae3a4c93f2bdc8f2eaf27b3747596fb3596 | |
| parent | ebac6ef50524919831863c6338903027399abd36 (diff) | |
Add v2 with GCM_IV_LENGTH of 96 bits == 12 bytes for performance and interop reasons
| -rw-r--r-- | receiver.cpp | 26 | 
1 files changed, 14 insertions, 12 deletions
| diff --git a/receiver.cpp b/receiver.cpp index 2fa2d8a..aaf9673 100644 --- a/receiver.cpp +++ b/receiver.cpp | |||
| @@ -80,7 +80,7 @@ static time_t now() { | |||
| 80 | } | 80 | } | 
| 81 | 81 | ||
| 82 | // Constants | 82 | // Constants | 
| 83 | enum { SESSION_ID_LENGTH = 8, AES_KEY_LENGTH = 16, GCM_IV_LENGTH = 16, GCM_TAG_LENGTH = 16, MIN_PACKET_SIZE = 40 }; | 83 | enum { SESSION_ID_LENGTH = 8, AES_KEY_LENGTH = 16, GCM_IV_LENGTH_LEGACY = 16, GCM_IV_LENGTH = 12, GCM_TAG_LENGTH = 16, MIN_PACKET_SIZE = 40 }; | 
| 84 | enum { DIRNAME_LENGTH = 10, FILENAME_LENGTH = 73, SIDOFFS = 20, KEYOFFS = 37 }; | 84 | enum { DIRNAME_LENGTH = 10, FILENAME_LENGTH = 73, SIDOFFS = 20, KEYOFFS = 37 }; | 
| 85 | 85 | ||
| 86 | class Session { | 86 | class Session { | 
| @@ -132,19 +132,21 @@ public: | |||
| 132 | return open((_dirname + "/" + _filename).c_str(), O_WRONLY | O_APPEND | O_CREAT, 0755); | 132 | return open((_dirname + "/" + _filename).c_str(), O_WRONLY | O_APPEND | O_CREAT, 0755); | 
| 133 | } | 133 | } | 
| 134 | 134 | ||
| 135 | void write_log(const uint8_t *packet, size_t len) { | 135 | void write_log(const uint8_t *packet, size_t len, int version = 2) { | 
| 136 | const size_t iv_len = ( version == 1 ? GCM_IV_LENGTH_LEGACY : GCM_IV_LENGTH); | ||
| 137 | |||
| 136 | // First check if the packet holds enough space for session id, iv and at least one gcm block | 138 | // First check if the packet holds enough space for session id, iv and at least one gcm block | 
| 137 | if (len < GCM_IV_LENGTH + GCM_TAG_LENGTH) { | 139 | if (len < iv_len + GCM_TAG_LENGTH) { | 
| 138 | std::cerr << "Error: Short packet, size " << len << std::endl; | 140 | std::cerr << "Error: Short packet, size " << len << std::endl; | 
| 139 | return; | 141 | return; | 
| 140 | } | 142 | } | 
| 141 | 143 | ||
| 142 | const uint8_t *iv = packet; | 144 | const uint8_t *iv = packet; | 
| 143 | const uint8_t *tag = packet + GCM_IV_LENGTH; | 145 | const uint8_t *tag = packet + iv_len; | 
| 144 | const uint8_t *payload = packet + GCM_IV_LENGTH + GCM_TAG_LENGTH; | 146 | const uint8_t *payload = packet + iv_len + GCM_TAG_LENGTH; | 
| 145 | len -= GCM_IV_LENGTH + GCM_TAG_LENGTH; | 147 | len -= iv_len + GCM_TAG_LENGTH; | 
| 146 | 148 | ||
| 147 | std::string ivs(packet, packet +GCM_IV_LENGTH); | 149 | std::string ivs(packet, packet + iv_len); | 
| 148 | if (_used_ivs.find(ivs) != _used_ivs.end()) { | 150 | if (_used_ivs.find(ivs) != _used_ivs.end()) { | 
| 149 | std::cerr << "Error: Session " << std::hex << _session_id << " reused IV. Dropping packet" << std::endl; | 151 | std::cerr << "Error: Session " << std::hex << _session_id << " reused IV. Dropping packet" << std::endl; | 
| 150 | return; | 152 | return; | 
| @@ -163,7 +165,7 @@ public: | |||
| 163 | uint8_t *output = static_cast<uint8_t*>(alloca(len)); | 165 | uint8_t *output = static_cast<uint8_t*>(alloca(len)); | 
| 164 | 166 | ||
| 165 | // This should fail on invalid input sizes | 167 | // This should fail on invalid input sizes | 
| 166 | switch (mbedtls_gcm_auth_decrypt(&_ctx, len, iv, GCM_IV_LENGTH, (uint8_t*)&_session_id, SESSION_ID_LENGTH, tag, GCM_TAG_LENGTH, payload, output)) | 168 | switch (mbedtls_gcm_auth_decrypt(&_ctx, len, iv, iv_len, (uint8_t*)&_session_id, SESSION_ID_LENGTH, tag, GCM_TAG_LENGTH, payload, output)) | 
| 167 | { | 169 | { | 
| 168 | case 0: | 170 | case 0: | 
| 169 | write(_fd, output, len); | 171 | write(_fd, output, len); | 
| @@ -325,13 +327,13 @@ int main() { | |||
| 325 | if (session == g_sessions.end()) | 327 | if (session == g_sessions.end()) | 
| 326 | g_sessions[session_id] = std::make_unique<Session>(session_id, rsa_plain_text); | 328 | g_sessions[session_id] = std::make_unique<Session>(session_id, rsa_plain_text); | 
| 327 | break; | 329 | break; | 
| 328 | case 1: { | 330 | case 1: | 
| 331 | case 2: | ||
| 329 | if (session != g_sessions.end()) | 332 | if (session != g_sessions.end()) | 
| 330 | session->second->write_log(packet + 1 + SESSION_ID_LENGTH, len - 1 - SESSION_ID_LENGTH); | 333 | session->second->write_log(packet + 1 + SESSION_ID_LENGTH, len - 1 - SESSION_ID_LENGTH, static_cast<int>(packet[0])); | 
| 331 | else | 334 | else | 
| 332 | std::cerr << "Error: Can't log to unknown session " << std::hex << session_id << std::endl; | 335 | std::cerr << "Error: Can't log to unknown session " << std::hex << session_id << std::dec << std::endl; | 
| 333 | break; | 336 | break; | 
| 334 | } | ||
| 335 | default: | 337 | default: | 
| 336 | break; | 338 | break; | 
| 337 | } | 339 | } | 
