aboutsummaryrefslogtreecommitdiffstats
path: root/append.c
diff options
context:
space:
mode:
authorCameron Katri <me@cameronkatri.com>2022-06-16 10:17:00 -0400
committerCameron Katri <me@cameronkatri.com>2022-06-16 10:21:50 -0400
commit9ef2c4a87d6fa816639b610313b67b98e983388a (patch)
treef3c5d259a3e0b87c5301ddf23b3185b4de9fbe9f /append.c
parent6a5be2524f0d31a601687e8b5d09b9af92848dac (diff)
downloadtrustcache-main.tar.gz
trustcache-main.tar.zst
trustcache-main.zip
Add support for new version 2 trustcachesHEADmain
Thanks to Linus Henze for reversing the new format https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056
Diffstat (limited to 'append.c')
-rw-r--r--append.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/append.c b/append.c
index 5bc468d..fc0cb85 100644
--- a/append.c
+++ b/append.c
@@ -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: