diff options
author | Cameron Katri <me@cameronkatri.com> | 2022-06-16 10:17:00 -0400 |
---|---|---|
committer | Cameron Katri <me@cameronkatri.com> | 2022-06-16 10:21:50 -0400 |
commit | 9ef2c4a87d6fa816639b610313b67b98e983388a (patch) | |
tree | f3c5d259a3e0b87c5301ddf23b3185b4de9fbe9f /append.c | |
parent | 6a5be2524f0d31a601687e8b5d09b9af92848dac (diff) | |
download | trustcache-main.tar.gz trustcache-main.tar.zst trustcache-main.zip |
Thanks to Linus Henze for reversing the new format
https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056
Diffstat (limited to 'append.c')
-rw-r--r-- | append.c | 34 |
1 files changed, 29 insertions, 5 deletions
@@ -54,9 +54,10 @@ tcappend(int argc, char **argv) uuid_t uuid; const char *errstr = NULL; uint8_t flags = 0; + uint16_t category = 0; int ch; - while ((ch = getopt(argc, argv, "u:f:")) != -1) { + while ((ch = getopt(argc, argv, "u:f:c:")) != -1) { switch (ch) { case 'u': if (strlen(optarg) == 1 && *optarg == '0') { @@ -75,6 +76,13 @@ tcappend(int argc, char **argv) exit(1); } break; + case 'c': + category = strtonum(optarg, 0, UINT16_MAX, &errstr); + if (errstr != NULL) { + fprintf(stderr, "category number is %s: %s\n", errstr, optarg); + exit(1); + } + break; } } @@ -98,10 +106,14 @@ tcappend(int argc, char **argv) append.hashes = calloc(1, sizeof(trust_cache_hash0)); for (size_t j = 0; j < CS_CDHASH_LEN; j++) sscanf(argv[i] + 2 * j, "%02hhx", &append.hashes[0][j]); - } else { + } else if (append.version == 1) { append.entries = calloc(1, sizeof(struct trust_cache_entry1)); for (size_t j = 0; j < CS_CDHASH_LEN; j++) sscanf(argv[i] + 2 * j, "%02hhx", &append.entries[0].cdhash[j]); + } else if (append.version == 2) { + append.entries2 = calloc(1, sizeof(struct trust_cache_entry2)); + for (size_t j = 0; j < CS_CDHASH_LEN; j++) + sscanf(argv[i] + 2 * j, "%02hhx", &append.entries2[0].cdhash[j]); } } else { append = cache_from_tree(argv[i], cache.version); @@ -122,15 +134,27 @@ tcappend(int argc, char **argv) cache.entries[cache.num_entries + j].flags = flags != 0 ? flags : append.entries[j].flags; memcpy(cache.entries[cache.num_entries + j].cdhash, append.entries[j].cdhash, CS_CDHASH_LEN); } + } else if (append.version == 2) { + if ((cache.entries2 = realloc(cache.entries, sizeof(struct trust_cache_entry2) * + (cache.num_entries + append.num_entries))) == NULL) + exit(1); + for (uint32_t j = 0; j < append.num_entries; j++) { + cache.entries2[cache.num_entries + j].hash_type = append.entries[j].hash_type; + cache.entries2[cache.num_entries + j].flags = flags != 0 ? flags : append.entries[j].flags; + cache.entries2[cache.num_entries + j].category = category != 0 ? category : append.entries2[j].category; + memcpy(cache.entries2[cache.num_entries + j].cdhash, append.entries2[j].cdhash, CS_CDHASH_LEN); + } } free(append.hashes); cache.num_entries += append.num_entries; } - if (cache.version == 1) - qsort(cache.entries, cache.num_entries, sizeof(*cache.entries), ent_cmp); - else if (cache.version == 0) + if (cache.version == 0) qsort(cache.hashes, cache.num_entries, sizeof(*cache.hashes), hash_cmp); + else if (cache.version == 1) + qsort(cache.entries, cache.num_entries, sizeof(*cache.entries), ent_cmp); + else if (cache.version == 2) + qsort(cache.entries, cache.num_entries, sizeof(*cache.entries2), ent_cmp); switch (keepuuid) { case 0: |