iMove hashing to top layer - 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 4d8c3d50ca614a40275ad223fdfd31fd897b9627 /scm/dedup/commit/4d8c3d50ca614a40275ad223fdfd31fd897b9627.gph bitreich.org 70 1parent c3a040a2db7964be918a34acc35db912431757b1 /scm/dedup/commit/c3a040a2db7964be918a34acc35db912431757b1.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Tue, 14 May 2019 13:05:50 +0300 Err bitreich.org 70 i Err bitreich.org 70 iMove hashing to top layer Err bitreich.org 70 i Err bitreich.org 70 iThe hash of the block should be the hash of the plaintext block. This Err bitreich.org 70 iis because when encryption is enabled the final block is always Err bitreich.org 70 idifferent even if it contained the same data originally. This is due Err bitreich.org 70 ito the fact that each encrypted block contains a unique nonce. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M bcompress.c | 9 --------- Err bitreich.org 70 i M bencrypt.c | 9 --------- Err bitreich.org 70 i M block.c | 58 ++++++++++++++++++++++++++++++- Err bitreich.org 70 i M block.h | 1 - Err bitreich.org 70 i M bstorage.c | 79 +------------------------------ Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 58 insertions(+), 98 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/bcompress.c b/bcompress.c /scm/dedup/file/bcompress.c.gph bitreich.org 70 i@@ -36,7 +36,6 @@ static int bcput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i static int bcget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i static int bcrm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bcgc(struct bctx *bctx); Err bitreich.org 70 i-static int bccheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bcsync(struct bctx *bctx); Err bitreich.org 70 i static int bcclose(struct bctx *bctx); Err bitreich.org 70 i Err bitreich.org 70 i@@ -47,7 +46,6 @@ static struct bops bops = { Err bitreich.org 70 i .get = bcget, Err bitreich.org 70 i .rm = bcrm, Err bitreich.org 70 i .gc = bcgc, Err bitreich.org 70 i- .check = bccheck, Err bitreich.org 70 i .sync = bcsync, Err bitreich.org 70 i .close = bcclose, Err bitreich.org 70 i }; Err bitreich.org 70 i@@ -318,13 +316,6 @@ bcgc(struct bctx *bctx) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-bccheck(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i-{ Err bitreich.org 70 i- return bencryptops()->check(bctx, md); Err bitreich.org 70 i- Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static int Err bitreich.org 70 i bcsync(struct bctx *bctx) Err bitreich.org 70 i { Err bitreich.org 70 i return bencryptops()->sync(bctx); Err bitreich.org 70 1diff --git a/bencrypt.c b/bencrypt.c /scm/dedup/file/bencrypt.c.gph bitreich.org 70 i@@ -34,7 +34,6 @@ static int beput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i static int beget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i static int berm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int begc(struct bctx *bctx); Err bitreich.org 70 i-static int becheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int besync(struct bctx *bctx); Err bitreich.org 70 i static int beclose(struct bctx *bctx); Err bitreich.org 70 i Err bitreich.org 70 i@@ -45,7 +44,6 @@ static struct bops bops = { Err bitreich.org 70 i .get = beget, Err bitreich.org 70 i .rm = berm, Err bitreich.org 70 i .gc = begc, Err bitreich.org 70 i- .check = becheck, Err bitreich.org 70 i .sync = besync, Err bitreich.org 70 i .close = beclose, Err bitreich.org 70 i }; Err bitreich.org 70 i@@ -325,13 +323,6 @@ begc(struct bctx *bctx) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-becheck(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i-{ Err bitreich.org 70 i- return bstorageops()->check(bctx, md); Err bitreich.org 70 i- Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static int Err bitreich.org 70 i besync(struct bctx *bctx) Err bitreich.org 70 i { Err bitreich.org 70 i return bstorageops()->sync(bctx); Err bitreich.org 70 1diff --git a/block.c b/block.c /scm/dedup/file/block.c.gph bitreich.org 70 i@@ -9,9 +9,18 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i #include "block.h" Err bitreich.org 70 i+#include "config.h" Err bitreich.org 70 i #include "misc.h" Err bitreich.org 70 i Err bitreich.org 70 i+static int Err bitreich.org 70 i+bhash(void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return crypto_generichash(md, MDSIZE, buf, n, NULL, 0); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i int Err bitreich.org 70 i bcreat(char *path, int mode, struct bctx **bctx) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -20,6 +29,11 @@ bcreat(char *path, int mode, struct bctx **bctx) Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ if (sodium_init() < 0) { Err bitreich.org 70 i+ seterr("sodium_init: failed"); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i *bctx = calloc(1, sizeof(**bctx)); Err bitreich.org 70 i if (*bctx == NULL) { Err bitreich.org 70 i seterr("calloc: %s", strerror(errno)); Err bitreich.org 70 i@@ -41,6 +55,11 @@ bopen(char *path, int flags, int mode, struct bctx **bctx) Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ if (sodium_init() < 0) { Err bitreich.org 70 i+ seterr("sodium_init: failed"); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i *bctx = calloc(1, sizeof(**bctx)); Err bitreich.org 70 i if (*bctx == NULL) { Err bitreich.org 70 i seterr("calloc: %s", strerror(errno)); Err bitreich.org 70 i@@ -62,6 +81,11 @@ bput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ if (bhash(buf, n, md) < 0) { Err bitreich.org 70 i+ seterr("bhash: failed"); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i return bcompressops()->put(bctx, buf, n, md); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -98,15 +122,47 @@ bgc(struct bctx *bctx) Err bitreich.org 70 i return bcompressops()->gc(bctx); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Lookup the block given hash and rehash it. Err bitreich.org 70 i+ * Check that the hashes match. It returns -1 Err bitreich.org 70 i+ * on error, 0 on success and 1 if a block hash Err bitreich.org 70 i+ * mismatch is detected. Err bitreich.org 70 i+ */ Err bitreich.org 70 i int Err bitreich.org 70 i bcheck(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i { Err bitreich.org 70 i+ unsigned char tmp[MDSIZE]; Err bitreich.org 70 i+ void *buf; Err bitreich.org 70 i+ size_t n; Err bitreich.org 70 i+ Err bitreich.org 70 i if (bctx == NULL || md == NULL) { Err bitreich.org 70 i seterr("invalid params"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- return bcompressops()->check(bctx, md); Err bitreich.org 70 i+ buf = malloc(BSIZEMAX); Err bitreich.org 70 i+ if (buf == NULL) { Err bitreich.org 70 i+ seterr("malloc: out of memory"); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ n = BSIZEMAX; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (bcompressops()->get(bctx, md, buf, &n) < 0) { Err bitreich.org 70 i+ free(buf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (bhash(buf, n, tmp) < 0) { Err bitreich.org 70 i+ free(buf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (memcmp(tmp, md, MDSIZE) != 0) { Err bitreich.org 70 i+ free(buf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ free(buf); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 1diff --git a/block.h b/block.h /scm/dedup/file/block.h.gph bitreich.org 70 i@@ -21,7 +21,6 @@ struct bops { Err bitreich.org 70 i int (*get)(struct bctx *, unsigned char *, void *, size_t *); Err bitreich.org 70 i int (*rm)(struct bctx *, unsigned char *); Err bitreich.org 70 i int (*gc)(struct bctx *); Err bitreich.org 70 i- int (*check)(struct bctx *, unsigned char *); Err bitreich.org 70 i int (*sync)(struct bctx *); Err bitreich.org 70 i int (*close)(struct bctx *); Err bitreich.org 70 i }; Err bitreich.org 70 1diff --git a/bstorage.c b/bstorage.c /scm/dedup/file/bstorage.c.gph bitreich.org 70 i@@ -22,8 +22,6 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i-#include Err bitreich.org 70 i- Err bitreich.org 70 i #include "block.h" Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i #include "misc.h" Err bitreich.org 70 i@@ -56,7 +54,6 @@ static int bsput(struct bctx *, void *, size_t, unsigned char *); Err bitreich.org 70 i static int bsget(struct bctx *, unsigned char *, void *, size_t *); Err bitreich.org 70 i static int bsrm(struct bctx *, unsigned char *); Err bitreich.org 70 i static int bsgc(struct bctx *); Err bitreich.org 70 i-static int bscheck(struct bctx *, unsigned char *); Err bitreich.org 70 i static int bssync(struct bctx *); Err bitreich.org 70 i static int bsclose(struct bctx *); Err bitreich.org 70 i Err bitreich.org 70 i@@ -67,7 +64,6 @@ static struct bops bops = { Err bitreich.org 70 i .get = bsget, Err bitreich.org 70 i .rm = bsrm, Err bitreich.org 70 i .gc = bsgc, Err bitreich.org 70 i- .check = bscheck, Err bitreich.org 70 i .sync = bssync, Err bitreich.org 70 i .close = bsclose, Err bitreich.org 70 i }; Err bitreich.org 70 i@@ -116,12 +112,6 @@ bd_cmp(struct bd *b1, struct bd *b2) Err bitreich.org 70 i static RB_PROTOTYPE(bdcache, bd, rbe, bd_cmp) Err bitreich.org 70 i static RB_GENERATE(bdcache, bd, rbe, bd_cmp) Err bitreich.org 70 i Err bitreich.org 70 i-static int Err bitreich.org 70 i-bhash(void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i-{ Err bitreich.org 70 i- return crypto_generichash(md, MDSIZE, buf, n, NULL, 0); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i /* Unpack block header */ Err bitreich.org 70 i static int Err bitreich.org 70 i unpackbhdr(unsigned char *buf, struct bhdr *bhdr) Err bitreich.org 70 i@@ -283,11 +273,6 @@ bscreat(struct bctx *bctx, char *path, int mode) Err bitreich.org 70 i struct bhdr *bhdr; Err bitreich.org 70 i int fd; Err bitreich.org 70 i Err bitreich.org 70 i- if (sodium_init() < 0) { Err bitreich.org 70 i- seterr("sodium_init: failed"); Err bitreich.org 70 i- return -1; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i fd = open(path, O_RDWR | O_CREAT | O_EXCL, mode); Err bitreich.org 70 i if (fd < 0) { Err bitreich.org 70 i seterr("open: %s", strerror(errno)); Err bitreich.org 70 i@@ -342,11 +327,6 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode) Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- if (sodium_init() < 0) { Err bitreich.org 70 i- seterr("sodium_init: failed"); Err bitreich.org 70 i- return -1; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i fd = open(path, flags, mode); Err bitreich.org 70 i if (fd < 0) { Err bitreich.org 70 i seterr("open: %s", strerror(errno)); Err bitreich.org 70 i@@ -409,17 +389,13 @@ bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i struct bd key, *bd; Err bitreich.org 70 i off_t offs; Err bitreich.org 70 i Err bitreich.org 70 i- if (bhash(buf, n, key.md) < 0) { Err bitreich.org 70 i- seterr("bhash: failed"); Err bitreich.org 70 i- return -1; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i /* Err bitreich.org 70 i * If the block is already present in the cache Err bitreich.org 70 i * just increment the reference count and write back Err bitreich.org 70 i * the block descriptor associated for that block. Err bitreich.org 70 i */ Err bitreich.org 70 i sctx = bctx->sctx; Err bitreich.org 70 i+ memcpy(key.md, md, MDSIZE); Err bitreich.org 70 i bd = RB_FIND(bdcache, &sctx->bdcache, &key); Err bitreich.org 70 i if (bd != NULL) { Err bitreich.org 70 i off_t bdoffs; Err bitreich.org 70 i@@ -605,59 +581,6 @@ bsgc(struct bctx *bctx) Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Lookup the block given hash and rehash it. Err bitreich.org 70 i- * Check that the hashes match. It returns -1 Err bitreich.org 70 i- * on error, 0 on success and 1 if a block hash Err bitreich.org 70 i- * mismatch is detected. Err bitreich.org 70 i- */ Err bitreich.org 70 i-static int Err bitreich.org 70 i-bscheck(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct sctx *sctx; Err bitreich.org 70 i- struct bd key, *bd; Err bitreich.org 70 i- void *buf; Err bitreich.org 70 i- Err bitreich.org 70 i- sctx = bctx->sctx; Err bitreich.org 70 i- memcpy(key.md, md, MDSIZE); Err bitreich.org 70 i- bd = RB_FIND(bdcache, &sctx->bdcache, &key); Err bitreich.org 70 i- if (bd == NULL) { Err bitreich.org 70 i- seterr("unknown block"); Err bitreich.org 70 i- return -1; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- buf = malloc(bd->size); Err bitreich.org 70 i- if (buf == NULL) { Err bitreich.org 70 i- seterr("malloc: %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 (lseek(sctx->fd, bd->offset, SEEK_SET) < 0) { Err bitreich.org 70 i- free(buf); Err bitreich.org 70 i- seterr("lseek: %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, buf, bd->size) != bd->size) { Err bitreich.org 70 i- free(buf); Err bitreich.org 70 i- seterr("failed to read block: %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 (bhash(buf, bd->size, key.md) < 0) { Err bitreich.org 70 i- free(buf); Err bitreich.org 70 i- seterr("bhash: failed"); Err bitreich.org 70 i- return -1; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- if (memcmp(key.md, md, MDSIZE) != 0) { Err bitreich.org 70 i- free(buf); Err bitreich.org 70 i- return 1; Err bitreich.org 70 i- } Err bitreich.org 70 i- free(buf); Err bitreich.org 70 i- return 0; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i /* Sync block header to storage file */ Err bitreich.org 70 i static int Err bitreich.org 70 i bssync(struct bctx *bctx) Err bitreich.org 70 .