iSplit initmdhead() into plaintext/encrypted variants - dedup - deduplicating backup program Err bitreich.org 70 hgit clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ URL:git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ bitreich.org 70 1Log /scm/dedup/log.gph bitreich.org 70 1Files /scm/dedup/files.gph bitreich.org 70 1Refs /scm/dedup/refs.gph bitreich.org 70 1Tags /scm/dedup/tag bitreich.org 70 1README /scm/dedup/file/README.gph bitreich.org 70 1LICENSE /scm/dedup/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit da5196be59c4f03fd81127900dd1b1afdbdfa34f /scm/dedup/commit/da5196be59c4f03fd81127900dd1b1afdbdfa34f.gph bitreich.org 70 1parent 1c0530ef5bf190a62ca8ce7c9b3ae14702b44a7f /scm/dedup/commit/1c0530ef5bf190a62ca8ce7c9b3ae14702b44a7f.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Tue, 14 May 2019 13:33:06 +0300 Err bitreich.org 70 i Err bitreich.org 70 iSplit initmdhead() into plaintext/encrypted variants Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M snap.c | 143 ++++++++++++++++--------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 76 insertions(+), 67 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/snap.c b/snap.c /scm/dedup/file/snap.c.gph bitreich.org 70 i@@ -94,84 +94,93 @@ packshdr(unsigned char *buf, struct shdr *shdr) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i+loadmdnone(struct sctx *sctx, int first) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct mdnode *mdnode; Err bitreich.org 70 i+ Err bitreich.org 70 i+ mdnode = calloc(1, sizeof(*mdnode)); Err bitreich.org 70 i+ if (mdnode == NULL) { Err bitreich.org 70 i+ seterr("calloc: %s", strerror(errno)); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (xread(sctx->fd, mdnode->md, MDSIZE) != MDSIZE) { Err bitreich.org 70 i+ seterr("failed to read block hash: %s", strerror(errno)); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ TAILQ_INSERT_TAIL(&sctx->mdhead, mdnode, e); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+loadmdcrypto(struct sctx *sctx, int first) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ unsigned char buf[MDSIZE + crypto_secretstream_xchacha20poly1305_ABYTES]; Err bitreich.org 70 i+ unsigned char hdr[SHDRSIZE]; Err bitreich.org 70 i+ static crypto_secretstream_xchacha20poly1305_state state; Err bitreich.org 70 i+ struct mdnode *mdnode; Err bitreich.org 70 i+ struct shdr *shdr; Err bitreich.org 70 i+ Err bitreich.org 70 i+ shdr = &sctx->shdr; Err bitreich.org 70 i+ packshdr(hdr, shdr); Err bitreich.org 70 i+ if (first && crypto_secretstream_xchacha20poly1305_init_pull(&state, Err bitreich.org 70 i+ shdr->header, Err bitreich.org 70 i+ param.key) < 0) { Err bitreich.org 70 i+ seterr("invalid crypto header"); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (xread(sctx->fd, buf, sizeof(buf)) != sizeof(buf)) { Err bitreich.org 70 i+ seterr("failed to read block hash: %s", strerror(errno)); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ mdnode = calloc(1, sizeof(*mdnode)); Err bitreich.org 70 i+ if (mdnode == NULL) { Err bitreich.org 70 i+ seterr("calloc: %s", strerror(errno)); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (crypto_secretstream_xchacha20poly1305_pull(&state, mdnode->md, NULL, Err bitreich.org 70 i+ NULL, buf, sizeof(buf), Err bitreich.org 70 i+ hdr, sizeof(hdr)) < 0) { Err bitreich.org 70 i+ free(mdnode); Err bitreich.org 70 i+ seterr("authentication failed"); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ TAILQ_INSERT_TAIL(&sctx->mdhead, mdnode, e); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i initmdhead(struct sctx *sctx) Err bitreich.org 70 i { Err bitreich.org 70 i struct shdr *shdr; Err bitreich.org 70 i+ int (*fn)(struct sctx *, int); Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i+ if (!sctx->crypto) Err bitreich.org 70 i+ fn = loadmdnone; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ fn = loadmdcrypto; Err bitreich.org 70 i+ Err bitreich.org 70 i shdr = &sctx->shdr; Err bitreich.org 70 i- if (sctx->crypto) { Err bitreich.org 70 i- unsigned char ad[SHDRSIZE]; Err bitreich.org 70 i- crypto_secretstream_xchacha20poly1305_state state; Err bitreich.org 70 i- struct shdr *shdr; Err bitreich.org 70 i- Err bitreich.org 70 i- shdr = &sctx->shdr; Err bitreich.org 70 i- packshdr(ad, shdr); Err bitreich.org 70 i- Err bitreich.org 70 i- if (crypto_secretstream_xchacha20poly1305_init_pull(&state, Err bitreich.org 70 i- shdr->header, Err bitreich.org 70 i- param.key) < 0) { Err bitreich.org 70 i- seterr("invalid crypto header"); Err bitreich.org 70 i- return -1; Err bitreich.org 70 i- } Err bitreich.org 70 i+ for (i = 0; i < shdr->nbd; i++) { Err bitreich.org 70 i+ if ((*fn)(sctx, i == 0) == 0) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i Err bitreich.org 70 i- for (i = 0; i < shdr->nbd; i++) { Err bitreich.org 70 i- unsigned char buf[MDSIZE + crypto_secretstream_xchacha20poly1305_ABYTES]; Err bitreich.org 70 i- unsigned char md[MDSIZE]; Err bitreich.org 70 i- struct mdnode *mdnode; Err bitreich.org 70 i- unsigned char tag; Err bitreich.org 70 i- Err bitreich.org 70 i- if (xread(sctx->fd, buf, sizeof(buf)) != sizeof(buf)) { Err bitreich.org 70 i- seterr("failed to read block hash: %s", strerror(errno)); Err bitreich.org 70 i- goto err0; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- if (crypto_secretstream_xchacha20poly1305_pull(&state, md, NULL, &tag, Err bitreich.org 70 i- buf, sizeof(buf), Err bitreich.org 70 i- ad, sizeof(ad)) < 0) { Err bitreich.org 70 i- seterr("authentication failed"); Err bitreich.org 70 i- goto err0; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- mdnode = calloc(1, sizeof(*mdnode)); Err bitreich.org 70 i- if (mdnode == NULL) { Err bitreich.org 70 i- seterr("calloc: %s", strerror(errno)); Err bitreich.org 70 i- goto err0; Err bitreich.org 70 i- } Err bitreich.org 70 i- memcpy(mdnode->md, md, MDSIZE); Err bitreich.org 70 i- TAILQ_INSERT_TAIL(&sctx->mdhead, mdnode, e); Err bitreich.org 70 i- } Err bitreich.org 70 i- } else { Err bitreich.org 70 i- for (i = 0; i < shdr->nbd; i++) { Err bitreich.org 70 i- unsigned char md[MDSIZE]; Err bitreich.org 70 i+ while (!TAILQ_EMPTY(&sctx->mdhead)) { Err bitreich.org 70 i struct mdnode *mdnode; Err bitreich.org 70 i Err bitreich.org 70 i- if (xread(sctx->fd, md, MDSIZE) != MDSIZE) { Err bitreich.org 70 i- seterr("failed to read block hash: %s", strerror(errno)); Err bitreich.org 70 i- goto err0; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- mdnode = calloc(1, sizeof(*mdnode)); Err bitreich.org 70 i- if (mdnode == NULL) { Err bitreich.org 70 i- seterr("calloc: %s", strerror(errno)); Err bitreich.org 70 i- goto err0; Err bitreich.org 70 i- } Err bitreich.org 70 i- memcpy(mdnode->md, md, MDSIZE); Err bitreich.org 70 i- TAILQ_INSERT_TAIL(&sctx->mdhead, mdnode, e); Err bitreich.org 70 i+ mdnode = TAILQ_FIRST(&sctx->mdhead); Err bitreich.org 70 i+ TAILQ_REMOVE(&sctx->mdhead, mdnode, e); Err bitreich.org 70 i+ free(mdnode); Err bitreich.org 70 i } Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i } Err bitreich.org 70 i return 0; Err bitreich.org 70 i- Err bitreich.org 70 i-err0: Err bitreich.org 70 i- /* Cleanup */ Err bitreich.org 70 i- while (!TAILQ_EMPTY(&sctx->mdhead)) { Err bitreich.org 70 i- struct mdnode *mdnode; Err bitreich.org 70 i- Err bitreich.org 70 i- mdnode = TAILQ_FIRST(&sctx->mdhead); Err bitreich.org 70 i- TAILQ_REMOVE(&sctx->mdhead, mdnode, e); Err bitreich.org 70 i- free(mdnode); Err bitreich.org 70 i- } Err bitreich.org 70 i- return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i@@ -486,7 +495,7 @@ sclose(struct sctx *sctx) Err bitreich.org 70 i if (ssync(sctx) < 0) Err bitreich.org 70 i return -1; Err bitreich.org 70 i Err bitreich.org 70 i- /* Cleanup */ Err bitreich.org 70 i+ /* Free block hash list */ Err bitreich.org 70 i while (!TAILQ_EMPTY(&sctx->mdhead)) { Err bitreich.org 70 i struct mdnode *mdnode; Err bitreich.org 70 i Err bitreich.org 70 .