From cf2a0bda78e3eb02f0909c28fbdb2280e617979b Mon Sep 17 00:00:00 2001 From: Finn Schiermer Andersen Date: Thu, 2 Feb 2023 13:09:32 +0100 Subject: [PATCH 1/5] Add handling of hex encoded key to realm-trawler --- src/realm/exec/realm_trawler.cpp | 76 ++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/src/realm/exec/realm_trawler.cpp b/src/realm/exec/realm_trawler.cpp index 5eefcff692d..3890d1498c4 100644 --- a/src/realm/exec/realm_trawler.cpp +++ b/src/realm/exec/realm_trawler.cpp @@ -56,7 +56,9 @@ void consolidate_lists(std::vector& list, std::vector& list2) list.insert(list.end(), list2.begin(), list2.end()); list2.clear(); if (list.size() > 1) { - std::sort(begin(list), end(list), [](T& a, T& b) { return a.start < b.start; }); + std::sort(begin(list), end(list), [](T& a, T& b) { + return a.start < b.start; + }); auto prev = list.begin(); for (auto it = list.begin() + 1; it != list.end(); ++it) { @@ -79,7 +81,11 @@ void consolidate_lists(std::vector& list, std::vector& list2) } // Remove all of the now zero-size chunks from the free list - list.erase(std::remove_if(begin(list), end(list), [](T& chunk) { return chunk.length == 0; }), end(list)); + list.erase(std::remove_if(begin(list), end(list), + [](T& chunk) { + return chunk.length == 0; + }), + end(list)); } } @@ -507,7 +513,9 @@ std::string human_readable(uint64_t val) uint64_t get_size(const std::vector& list) { uint64_t sz = 0; - std::for_each(list.begin(), list.end(), [&](const Entry& e) { sz += e.length; }); + std::for_each(list.begin(), list.end(), [&](const Entry& e) { + sz += e.length; + }); return sz; } @@ -1036,6 +1044,42 @@ void RealmFile::changes() const } } +bool is_hex(char c) +{ + if (c >= '0' && c <= '9') + return true; + if (c >= 'a' && c <= 'f') + return true; + if (c >= 'A' && c <= 'F') + return true; + return false; +} + +unsigned int hex_char_to_bin(char c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + exit(-1); +} + +unsigned int hex_to_bin(char first, char second) +{ + return (hex_char_to_bin(first) << 4) | hex_char_to_bin(second); +} + +char to_hex_char(char c) +{ + if (c < 10) + return c + '0'; + if (c < 16) + return c - 10 + 'a'; + return '!'; +} + int main(int argc, const char* argv[]) { if (argc > 1) { @@ -1055,6 +1099,32 @@ int main(int argc, const char* argv[]) key_ptr = key; curr_arg++; } + else if (strcmp(argv[curr_arg], "--hexkey") == 0) { + std::ifstream key_file(argv[curr_arg + 1]); + curr_arg++; + char chars[128]; + std::cout << "Using key: "; + for (int idx = 0; idx < 128; ++idx) { + char c; + do { + key_file.get(c); + // todo: check for failure + } while (!is_hex(c)); + chars[idx] = c; + std::cout << c; + } + std::cout << std::endl; + for (int idx = 0; idx < 64; ++idx) { + key[idx] = hex_to_bin(chars[idx * 2], chars[idx * 2 + 1]); + } + std::cout << "Key again: "; + for (int idx = 0; idx < 64; ++idx) { + char c = key[idx]; + std::cout << to_hex_char(c >> 4) << to_hex_char(c & 0xf); + } + std::cout << std::endl; + key_ptr = key; + } else if (strcmp(argv[curr_arg], "--top") == 0) { char* end; curr_arg++; From 7a354f5971e9b7a8cf5d626a931d659100644bc9 Mon Sep 17 00:00:00 2001 From: Finn Schiermer Andersen Date: Thu, 2 Feb 2023 13:36:55 +0100 Subject: [PATCH 2/5] give key on cmdline instead of via file --- src/realm/exec/realm_trawler.cpp | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/realm/exec/realm_trawler.cpp b/src/realm/exec/realm_trawler.cpp index 3890d1498c4..2ee131b054c 100644 --- a/src/realm/exec/realm_trawler.cpp +++ b/src/realm/exec/realm_trawler.cpp @@ -1102,27 +1102,10 @@ int main(int argc, const char* argv[]) else if (strcmp(argv[curr_arg], "--hexkey") == 0) { std::ifstream key_file(argv[curr_arg + 1]); curr_arg++; - char chars[128]; - std::cout << "Using key: "; - for (int idx = 0; idx < 128; ++idx) { - char c; - do { - key_file.get(c); - // todo: check for failure - } while (!is_hex(c)); - chars[idx] = c; - std::cout << c; - } - std::cout << std::endl; + const char* chars = argv[curr_arg]; for (int idx = 0; idx < 64; ++idx) { key[idx] = hex_to_bin(chars[idx * 2], chars[idx * 2 + 1]); } - std::cout << "Key again: "; - for (int idx = 0; idx < 64; ++idx) { - char c = key[idx]; - std::cout << to_hex_char(c >> 4) << to_hex_char(c & 0xf); - } - std::cout << std::endl; key_ptr = key; } else if (strcmp(argv[curr_arg], "--top") == 0) { From c5905145de617b639a5ca11e3c86fe25dd2c0dda Mon Sep 17 00:00:00 2001 From: Finn Schiermer Andersen Date: Thu, 2 Feb 2023 13:40:01 +0100 Subject: [PATCH 3/5] add helptext --- src/realm/exec/realm_trawler.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/realm/exec/realm_trawler.cpp b/src/realm/exec/realm_trawler.cpp index 2ee131b054c..3e3f38b1174 100644 --- a/src/realm/exec/realm_trawler.cpp +++ b/src/realm/exec/realm_trawler.cpp @@ -1093,14 +1093,13 @@ int main(int argc, const char* argv[]) const char* key_ptr = nullptr; char key[64]; for (int curr_arg = 1; curr_arg < argc; curr_arg++) { - if (strcmp(argv[curr_arg], "--key") == 0) { + if (strcmp(argv[curr_arg], "--keyfile") == 0) { std::ifstream key_file(argv[curr_arg + 1]); key_file.read(key, sizeof(key)); key_ptr = key; curr_arg++; } else if (strcmp(argv[curr_arg], "--hexkey") == 0) { - std::ifstream key_file(argv[curr_arg + 1]); curr_arg++; const char* chars = argv[curr_arg]; for (int idx = 0; idx < 64; ++idx) { @@ -1165,7 +1164,10 @@ int main(int argc, const char* argv[]) } } else { - std::cout << "Usage: realm-trawler [-afmsw] [--key crypt_key] [--top top_ref] " << std::endl; + std::cout << "Usage: realm-trawler [-afmsw] [--keyfile file-with-binary-crypt-key] [--hexkey " + "crypt-key-in-hex] [--top " + "top_ref] " + << std::endl; std::cout << " f : free list analysis" << std::endl; std::cout << " m : memory leak check" << std::endl; std::cout << " s : schema dump" << std::endl; From df5e1b7c64ce0c2617dd0342164b051090dcd8d4 Mon Sep 17 00:00:00 2001 From: Finn Schiermer Andersen Date: Fri, 3 Feb 2023 12:35:44 +0100 Subject: [PATCH 4/5] post-review fixes --- src/realm/exec/realm_trawler.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/realm/exec/realm_trawler.cpp b/src/realm/exec/realm_trawler.cpp index 3e3f38b1174..d9e3c4dc36d 100644 --- a/src/realm/exec/realm_trawler.cpp +++ b/src/realm/exec/realm_trawler.cpp @@ -1071,14 +1071,6 @@ unsigned int hex_to_bin(char first, char second) return (hex_char_to_bin(first) << 4) | hex_char_to_bin(second); } -char to_hex_char(char c) -{ - if (c < 10) - return c + '0'; - if (c < 16) - return c - 10 + 'a'; - return '!'; -} int main(int argc, const char* argv[]) { @@ -1103,6 +1095,9 @@ int main(int argc, const char* argv[]) curr_arg++; const char* chars = argv[curr_arg]; for (int idx = 0; idx < 64; ++idx) { + if (!is_hex(chars[idx * 2] || !is_hex(chars[idx * 2 + 1]))) { + throw std::runtime_error("Illegal key (wrong length or not hex)"); + } key[idx] = hex_to_bin(chars[idx * 2], chars[idx * 2 + 1]); } key_ptr = key; From d440810330d773cde75744e270b21dd6f97a7c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Edelbo?= Date: Fri, 3 Feb 2023 13:23:50 +0100 Subject: [PATCH 5/5] More like this --- src/realm/exec/realm_trawler.cpp | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/realm/exec/realm_trawler.cpp b/src/realm/exec/realm_trawler.cpp index d9e3c4dc36d..d732e4e4252 100644 --- a/src/realm/exec/realm_trawler.cpp +++ b/src/realm/exec/realm_trawler.cpp @@ -1044,17 +1044,6 @@ void RealmFile::changes() const } } -bool is_hex(char c) -{ - if (c >= '0' && c <= '9') - return true; - if (c >= 'a' && c <= 'f') - return true; - if (c >= 'A' && c <= 'F') - return true; - return false; -} - unsigned int hex_char_to_bin(char c) { if (c >= '0' && c <= '9') @@ -1063,7 +1052,7 @@ unsigned int hex_char_to_bin(char c) return c - 'a' + 10; if (c >= 'A' && c <= 'F') return c - 'A' + 10; - exit(-1); + throw std::invalid_argument("Illegal key (not a hex digit)"); } unsigned int hex_to_bin(char first, char second) @@ -1094,10 +1083,10 @@ int main(int argc, const char* argv[]) else if (strcmp(argv[curr_arg], "--hexkey") == 0) { curr_arg++; const char* chars = argv[curr_arg]; + if (strlen(chars) != 128) { + throw std::invalid_argument("Key string must be 128 chars long"); + } for (int idx = 0; idx < 64; ++idx) { - if (!is_hex(chars[idx * 2] || !is_hex(chars[idx * 2 + 1]))) { - throw std::runtime_error("Illegal key (wrong length or not hex)"); - } key[idx] = hex_to_bin(chars[idx * 2], chars[idx * 2 + 1]); } key_ptr = key;