iAdd initial encryption support - 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 c047a4a58e9abda33685cce531c0e7386cf35290 /scm/dedup/commit/c047a4a58e9abda33685cce531c0e7386cf35290.gph bitreich.org 70 1parent 847cf8d109bd0e6ac51fa6a76b14e5e08ccd9c39 /scm/dedup/commit/847cf8d109bd0e6ac51fa6a76b14e5e08ccd9c39.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Thu, 2 May 2019 14:55:03 +0100 Err bitreich.org 70 i Err bitreich.org 70 iAdd initial encryption support Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 15 +++++++++++---- Err bitreich.org 70 i M bcompress.c | 18 +++++++++--------- Err bitreich.org 70 i A bencrypt.c | 330 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M block.c | 2 +- Err bitreich.org 70 i M block.h | 6 ++++++ Err bitreich.org 70 i M bstorage.c | 36 ++++++++++++++++++++++++++++--- Err bitreich.org 70 i M config.h | 1 + Err bitreich.org 70 i M dup-check.1 | 7 +++++-- Err bitreich.org 70 i M dup-check.c | 25 ++++++++++++++++++++++++- Err bitreich.org 70 i M dup-gc.1 | 7 +++++-- Err bitreich.org 70 i M dup-gc.c | 26 ++++++++++++++++++++++++-- Err bitreich.org 70 i M dup-init.1 | 19 +++++++++++++------ Err bitreich.org 70 i M dup-init.c | 6 +++++- Err bitreich.org 70 i A dup-keygen.1 | 22 ++++++++++++++++++++++ Err bitreich.org 70 i A dup-keygen.c | 52 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M dup-pack.1 | 7 +++++-- Err bitreich.org 70 i M dup-pack.c | 25 ++++++++++++++++++++++++- Err bitreich.org 70 i M dup-rm.1 | 7 +++++-- Err bitreich.org 70 i M dup-rm.c | 24 +++++++++++++++++++++++- Err bitreich.org 70 i M dup-unpack.1 | 7 +++++-- Err bitreich.org 70 i M dup-unpack.c | 24 +++++++++++++++++++++++- Err bitreich.org 70 i A key.c | 39 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A key.h | 3 +++ Err bitreich.org 70 i A test006 | 18 ++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i24 files changed, 686 insertions(+), 40 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/dedup/file/Makefile.gph bitreich.org 70 i@@ -1,13 +1,14 @@ Err bitreich.org 70 i include config.mk Err bitreich.org 70 i Err bitreich.org 70 i-BIN = dup-check dup-gc dup-init dup-pack dup-rm dup-unpack Err bitreich.org 70 i-MAN = dup-check.1 dup-gc.1 dup-init.1 dup-pack.1 dup-rm.1 dup-unpack.1 Err bitreich.org 70 i+BIN = dup-check dup-gc dup-init dup-keygen dup-pack dup-rm dup-unpack Err bitreich.org 70 i+MAN = dup-check.1 dup-gc.1 dup-init.1 dup-keygen.1 dup-pack.1 dup-rm.1 dup-unpack.1 Err bitreich.org 70 i Err bitreich.org 70 i HDR = \ Err bitreich.org 70 i arg.h \ Err bitreich.org 70 i block.h \ Err bitreich.org 70 i chunker.h \ Err bitreich.org 70 i config.h \ Err bitreich.org 70 i+ key.h \ Err bitreich.org 70 i queue.h \ Err bitreich.org 70 i snap.h \ Err bitreich.org 70 i tree.h \ Err bitreich.org 70 i@@ -15,9 +16,11 @@ HDR = \ Err bitreich.org 70 i COMMOBJ = \ Err bitreich.org 70 i bcompat.o \ Err bitreich.org 70 i bcompress.o \ Err bitreich.org 70 i+ bencrypt.o \ Err bitreich.org 70 i block.o \ Err bitreich.org 70 i bstorage.o \ Err bitreich.org 70 i chunker.o \ Err bitreich.org 70 i+ key.o \ Err bitreich.org 70 i misc.o \ Err bitreich.org 70 i pack.o \ Err bitreich.org 70 i snap.o \ Err bitreich.org 70 i@@ -26,6 +29,7 @@ COMMOBJ = \ Err bitreich.org 70 i DCHECKOBJ = $(COMMOBJ) dup-check.o Err bitreich.org 70 i DGCOBJ = $(COMMOBJ) dup-gc.o Err bitreich.org 70 i DINITOBJ = $(COMMOBJ) dup-init.o Err bitreich.org 70 i+DKEYGENOBJ = $(COMMOBJ) dup-keygen.o Err bitreich.org 70 i DPACKOBJ = $(COMMOBJ) dup-pack.o Err bitreich.org 70 i DRMOBJ = $(COMMOBJ) dup-rm.o Err bitreich.org 70 i DUNPACKOBJ = $(COMMOBJ) dup-unpack.o Err bitreich.org 70 i@@ -34,10 +38,10 @@ LDLIBS = -lsnappy -lsodium Err bitreich.org 70 i Err bitreich.org 70 i all: $(BIN) Err bitreich.org 70 i Err bitreich.org 70 i-$(DCHECKOBJ) $(DGCOBJ) $(DINITOBJ) $(DPACKOBJ) $(DRMOBJ) $(DUNPACKOBJ): $(HDR) Err bitreich.org 70 i+$(DCHECKOBJ) $(DGCOBJ) $(DINITOBJ) $(DKEYGENOBJ) $(DPACKOBJ) $(DRMOBJ) $(DUNPACKOBJ): $(HDR) Err bitreich.org 70 i Err bitreich.org 70 i clean: Err bitreich.org 70 i- rm -f $(DCHECKOBJ) $(DGCOBJ) $(DINITOBJ) $(DPACKOBJ) $(DRMOBJ) $(DUNPACKOBJ) $(BIN) Err bitreich.org 70 i+ rm -f $(DCHECKOBJ) $(DGCOBJ) $(DINITOBJ) $(DKEYGENOBJ) $(DPACKOBJ) $(DRMOBJ) $(DUNPACKOBJ) $(BIN) Err bitreich.org 70 i rm -rf dedup-$(VERSION) dedup-$(VERSION).tar.gz Err bitreich.org 70 i Err bitreich.org 70 i install: all Err bitreich.org 70 i@@ -72,6 +76,9 @@ dup-gc: $(DGCOBJ) Err bitreich.org 70 i dup-init: $(DINITOBJ) Err bitreich.org 70 i $(CC) -o $@ $(DINITOBJ) $(LDFLAGS) $(LDLIBS) Err bitreich.org 70 i Err bitreich.org 70 i+dup-keygen: $(DKEYGENOBJ) Err bitreich.org 70 i+ $(CC) -o $@ $(DKEYGENOBJ) $(LDFLAGS) $(LDLIBS) Err bitreich.org 70 i+ Err bitreich.org 70 i dup-pack: $(DPACKOBJ) Err bitreich.org 70 i $(CC) -o $@ $(DPACKOBJ) $(LDFLAGS) $(LDLIBS) 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@@ -105,7 +105,7 @@ bccreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i cctx = bctx->cctx; Err bitreich.org 70 i cctx->type = type; Err bitreich.org 70 i Err bitreich.org 70 i- bops = bstorageops(); Err bitreich.org 70 i+ bops = bencryptops(); Err bitreich.org 70 i if (bops->creat(bctx, path, mode, bpar) < 0) { Err bitreich.org 70 i free(cctx); Err bitreich.org 70 i return -1; Err bitreich.org 70 i@@ -124,7 +124,7 @@ bcopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i return -1; Err bitreich.org 70 i cctx = bctx->cctx; Err bitreich.org 70 i Err bitreich.org 70 i- bops = bstorageops(); Err bitreich.org 70 i+ bops = bencryptops(); Err bitreich.org 70 i if (bops->open(bctx, path, flags, mode, bpar) < 0) { Err bitreich.org 70 i free(cctx); Err bitreich.org 70 i return -1; Err bitreich.org 70 i@@ -184,7 +184,7 @@ bcput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i cd.size = cn; Err bitreich.org 70 i packcd(cbuf, &cd); Err bitreich.org 70 i Err bitreich.org 70 i- bops = bstorageops(); Err bitreich.org 70 i+ bops = bencryptops(); Err bitreich.org 70 i if (bops->put(bctx, cbuf, CDSIZE + cn, md) < 0) { Err bitreich.org 70 i free(cbuf); Err bitreich.org 70 i return -1; Err bitreich.org 70 i@@ -215,7 +215,7 @@ bcget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n) Err bitreich.org 70 i return -1; Err bitreich.org 70 i Err bitreich.org 70 i /* Read compressed block */ Err bitreich.org 70 i- bops = bstorageops(); Err bitreich.org 70 i+ bops = bencryptops(); Err bitreich.org 70 i if (bops->get(bctx, md, cbuf, &size) < 0) { Err bitreich.org 70 i free(cbuf); Err bitreich.org 70 i return -1; Err bitreich.org 70 i@@ -262,7 +262,7 @@ bcget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n) Err bitreich.org 70 i static int Err bitreich.org 70 i bcrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i { Err bitreich.org 70 i- struct bops *bops = bstorageops(); Err bitreich.org 70 i+ struct bops *bops = bencryptops(); Err bitreich.org 70 i Err bitreich.org 70 i return bops->rm(bctx, md); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -270,7 +270,7 @@ bcrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i static int Err bitreich.org 70 i bcgc(struct bctx *bctx) Err bitreich.org 70 i { Err bitreich.org 70 i- struct bops *bops = bstorageops(); Err bitreich.org 70 i+ struct bops *bops = bencryptops(); Err bitreich.org 70 i Err bitreich.org 70 i return bops->gc(bctx); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -278,7 +278,7 @@ bcgc(struct bctx *bctx) 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- struct bops *bops = bstorageops(); Err bitreich.org 70 i+ struct bops *bops = bencryptops(); Err bitreich.org 70 i Err bitreich.org 70 i return bops->check(bctx, md); Err bitreich.org 70 i Err bitreich.org 70 i@@ -287,7 +287,7 @@ bccheck(struct bctx *bctx, unsigned char *md) 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- struct bops *bops = bstorageops(); Err bitreich.org 70 i+ struct bops *bops = bencryptops(); Err bitreich.org 70 i Err bitreich.org 70 i return bops->sync(bctx); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -299,7 +299,7 @@ bcclose(struct bctx *bctx) Err bitreich.org 70 i struct bops *bops; Err bitreich.org 70 i Err bitreich.org 70 i free(cctx); Err bitreich.org 70 i- bops = bstorageops(); Err bitreich.org 70 i+ bops = bencryptops(); Err bitreich.org 70 i return bops->close(bctx); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/bencrypt.c b/bencrypt.c /scm/dedup/file/bencrypt.c.gph bitreich.org 70 i@@ -0,0 +1,330 @@ Err bitreich.org 70 i+/* Encryption layer implementation */ 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+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include 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+ Err bitreich.org 70 i+#define EDNONETYPE 0x300 Err bitreich.org 70 i+#define EDCHACHATYPE 0x301 Err bitreich.org 70 i+#define EDSIZE (8 + 8 + 24) Err bitreich.org 70 i+ Err bitreich.org 70 i+extern int pack(unsigned char *, char *, ...); Err bitreich.org 70 i+extern int unpack(unsigned char *, char *, ...); Err bitreich.org 70 i+ Err bitreich.org 70 i+static int becreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar); Err bitreich.org 70 i+static int beopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar); Err bitreich.org 70 i+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+static struct bops bops = { Err bitreich.org 70 i+ .creat = becreat, Err bitreich.org 70 i+ .open = beopen, Err bitreich.org 70 i+ .put = beput, 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+ Err bitreich.org 70 i+/* Encryption layer context */ Err bitreich.org 70 i+struct ectx { Err bitreich.org 70 i+ int type; /* encryption algorithm type for new blocks */ Err bitreich.org 70 i+ unsigned char key[KEYSIZE]; /* secret key */ Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Encryption descriptor */ Err bitreich.org 70 i+struct ed { Err bitreich.org 70 i+ uint16_t type; /* encryption algorithm type */ Err bitreich.org 70 i+ uint8_t reserved[6]; Err bitreich.org 70 i+ uint64_t size; Err bitreich.org 70 i+ unsigned char nonce[crypto_aead_xchacha20poly1305_ietf_NPUBBYTES]; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Read encryption descriptor */ Err bitreich.org 70 i+static int Err bitreich.org 70 i+unpacked(void *buf, struct ed *ed) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = unpack(buf, "s'6q'24", Err bitreich.org 70 i+ &ed->type, Err bitreich.org 70 i+ ed->reserved, Err bitreich.org 70 i+ &ed->size, Err bitreich.org 70 i+ ed->nonce); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(n == EDSIZE); Err bitreich.org 70 i+ return n; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Write encryption descriptor */ Err bitreich.org 70 i+static int Err bitreich.org 70 i+packed(void *buf, struct ed *ed) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = pack(buf, "s'6q'24", Err bitreich.org 70 i+ ed->type, Err bitreich.org 70 i+ ed->reserved, Err bitreich.org 70 i+ ed->size, Err bitreich.org 70 i+ ed->nonce); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(n == EDSIZE); Err bitreich.org 70 i+ return n; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+becreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct ectx *ectx; Err bitreich.org 70 i+ struct bops *bops; Err bitreich.org 70 i+ int type; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (strcmp(bpar->ealgo, "none") == 0) Err bitreich.org 70 i+ type = EDNONETYPE; Err bitreich.org 70 i+ else if (strcmp(bpar->ealgo, "XChaCha20-Poly1305") == 0) Err bitreich.org 70 i+ type = EDCHACHATYPE; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (type != EDNONETYPE && bpar->key == NULL) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (sodium_init() < 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ bctx->ectx = calloc(1, sizeof(struct ectx)); Err bitreich.org 70 i+ if (bctx->ectx == NULL) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ ectx = bctx->ectx; Err bitreich.org 70 i+ ectx->type = type; Err bitreich.org 70 i+ if (bpar->key != NULL) Err bitreich.org 70 i+ memcpy(ectx->key, bpar->key, KEYSIZE); Err bitreich.org 70 i+ Err bitreich.org 70 i+ bops = bstorageops(); Err bitreich.org 70 i+ if (bops->creat(bctx, path, mode, bpar) < 0) { Err bitreich.org 70 i+ free(ectx); 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+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+beopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct ectx *ectx; Err bitreich.org 70 i+ struct bops *bops; Err bitreich.org 70 i+ Err bitreich.org 70 i+ bctx->ectx = calloc(1, sizeof(struct ectx)); Err bitreich.org 70 i+ if (bctx->ectx == NULL) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ ectx = bctx->ectx; Err bitreich.org 70 i+ if (bpar->key != NULL) Err bitreich.org 70 i+ memcpy(ectx->key, bpar->key, KEYSIZE); Err bitreich.org 70 i+ Err bitreich.org 70 i+ bops = bstorageops(); Err bitreich.org 70 i+ if (bops->open(bctx, path, flags, mode, bpar) < 0) { Err bitreich.org 70 i+ free(ectx); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (strcmp(bpar->ealgo, "none") == 0) Err bitreich.org 70 i+ ectx->type = EDNONETYPE; Err bitreich.org 70 i+ else if (strcmp(bpar->ealgo, "XChaCha20-Poly1305") == 0) Err bitreich.org 70 i+ ectx->type = EDCHACHATYPE; Err bitreich.org 70 i+ else { Err bitreich.org 70 i+ bops->close(bctx); Err bitreich.org 70 i+ free(ectx); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ectx->type != EDNONETYPE && bpar->key == NULL) { Err bitreich.org 70 i+ bops->close(bctx); Err bitreich.org 70 i+ free(ectx); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ 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+beput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct ectx *ectx; Err bitreich.org 70 i+ struct bops *bops; Err bitreich.org 70 i+ struct ed ed; Err bitreich.org 70 i+ char *ebuf; Err bitreich.org 70 i+ size_t en; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ectx = bctx->ectx; Err bitreich.org 70 i+ if (ectx->type == EDNONETYPE) Err bitreich.org 70 i+ en = n; Err bitreich.org 70 i+ else if (ectx->type == EDCHACHATYPE) Err bitreich.org 70 i+ en = n + crypto_aead_xchacha20poly1305_ietf_ABYTES; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ebuf = malloc(EDSIZE + en); Err bitreich.org 70 i+ if (ebuf == NULL) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ed.type = ectx->type; Err bitreich.org 70 i+ ed.size = en; Err bitreich.org 70 i+ if (ectx->type == EDNONETYPE) { Err bitreich.org 70 i+ memset(ed.nonce, 0, sizeof(ed.nonce)); Err bitreich.org 70 i+ } else if (ectx->type == EDCHACHATYPE) { Err bitreich.org 70 i+ randombytes_buf(ed.nonce, sizeof(ed.nonce)); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ free(ebuf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ packed(ebuf, &ed); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ectx->type == EDNONETYPE) { Err bitreich.org 70 i+ memcpy(&ebuf[EDSIZE], buf, en); Err bitreich.org 70 i+ } else if (ectx->type == EDCHACHATYPE) { Err bitreich.org 70 i+ unsigned long long elen; Err bitreich.org 70 i+ Err bitreich.org 70 i+ crypto_aead_xchacha20poly1305_ietf_encrypt(&ebuf[EDSIZE], &elen, Err bitreich.org 70 i+ buf, n, ebuf, EDSIZE, NULL, Err bitreich.org 70 i+ ed.nonce, ectx->key); Err bitreich.org 70 i+ assert(elen == en); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ free(ebuf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ bops = bstorageops(); Err bitreich.org 70 i+ if (bops->put(bctx, ebuf, EDSIZE + en, md) < 0) { Err bitreich.org 70 i+ free(ebuf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ free(ebuf); Err bitreich.org 70 i+ return ed.size; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+beget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct bops *bops; Err bitreich.org 70 i+ struct ed ed; Err bitreich.org 70 i+ char *ebuf; Err bitreich.org 70 i+ size_t dn, size; Err bitreich.org 70 i+ Err bitreich.org 70 i+ size = EDSIZE + *n + crypto_aead_xchacha20poly1305_ietf_ABYTES; Err bitreich.org 70 i+ ebuf = malloc(size); Err bitreich.org 70 i+ if (ebuf == NULL) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ bops = bstorageops(); Err bitreich.org 70 i+ if (bops->get(bctx, md, ebuf, &size) < 0) { Err bitreich.org 70 i+ free(ebuf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ unpacked(ebuf, &ed); Err bitreich.org 70 i+ if (ed.type == EDNONETYPE) { Err bitreich.org 70 i+ dn = ed.size; Err bitreich.org 70 i+ if (*n < dn) { Err bitreich.org 70 i+ free(ebuf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ memcpy(buf, &ebuf[EDSIZE], dn); Err bitreich.org 70 i+ } else if (ed.type == EDCHACHATYPE) { Err bitreich.org 70 i+ struct ectx *ectx; Err bitreich.org 70 i+ unsigned long long dlen; Err bitreich.org 70 i+ Err bitreich.org 70 i+ dn = ed.size - crypto_aead_xchacha20poly1305_ietf_ABYTES; Err bitreich.org 70 i+ if (*n < dn) { Err bitreich.org 70 i+ free(ebuf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ ectx = bctx->ectx; Err bitreich.org 70 i+ if (crypto_aead_xchacha20poly1305_ietf_decrypt(buf, &dlen, Err bitreich.org 70 i+ NULL, Err bitreich.org 70 i+ &ebuf[EDSIZE], ed.size, Err bitreich.org 70 i+ ebuf, EDSIZE, Err bitreich.org 70 i+ ed.nonce, ectx->key) != 0) { Err bitreich.org 70 i+ free(ebuf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(dn == dlen); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ free(ebuf); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ free(ebuf); Err bitreich.org 70 i+ *n = dn; 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+berm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct bops *bops = bstorageops(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return bops->rm(bctx, md); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+begc(struct bctx *bctx) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct bops *bops = bstorageops(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return bops->gc(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+ struct bops *bops = bstorageops(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return bops->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+ struct bops *bops = bstorageops(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return bops->sync(bctx); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+beclose(struct bctx *bctx) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct ectx *ectx = bctx->ectx; Err bitreich.org 70 i+ struct bops *bops; Err bitreich.org 70 i+ Err bitreich.org 70 i+ free(ectx); Err bitreich.org 70 i+ bops = bstorageops(); Err bitreich.org 70 i+ return bops->close(bctx); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+struct bops * Err bitreich.org 70 i+bencryptops(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return &bops; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/block.c b/block.c /scm/dedup/file/block.c.gph bitreich.org 70 i@@ -145,7 +145,7 @@ bclose(struct bctx *bctx) Err bitreich.org 70 i struct bparam * Err bitreich.org 70 i bparamdef(void) Err bitreich.org 70 i { Err bitreich.org 70 i- static struct bparam bpar = { .calgo = "snappy" }; Err bitreich.org 70 i+ static struct bparam bpar = { .calgo = "snappy", .ealgo = "none" }; Err bitreich.org 70 i Err bitreich.org 70 i return &bpar; Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/block.h b/block.h /scm/dedup/file/block.h.gph bitreich.org 70 i@@ -6,11 +6,14 @@ enum { Err bitreich.org 70 i struct bctx { Err bitreich.org 70 i void *gctx; /* generic layer context (unused) */ Err bitreich.org 70 i void *cctx; /* compression layer context */ Err bitreich.org 70 i+ void *ectx; /* encryption layer context */ Err bitreich.org 70 i void *sctx; /* storage layer context */ Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i struct bparam { Err bitreich.org 70 i char *calgo; Err bitreich.org 70 i+ char *ealgo; Err bitreich.org 70 i+ unsigned char *key; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -46,5 +49,8 @@ extern int punchhole(int, off_t, off_t); Err bitreich.org 70 i /* bcompress.c */ Err bitreich.org 70 i extern struct bops *bcompressops(void); Err bitreich.org 70 i Err bitreich.org 70 i+/* bencrypt.c */ Err bitreich.org 70 i+struct bops *bencryptops(void); Err bitreich.org 70 i+ Err bitreich.org 70 i /* bstorage.c */ Err bitreich.org 70 i extern struct bops *bstorageops(void); Err bitreich.org 70 1diff --git a/bstorage.c b/bstorage.c /scm/dedup/file/bstorage.c.gph bitreich.org 70 i@@ -35,6 +35,10 @@ Err bitreich.org 70 i #define VMINMASK 0xff Err bitreich.org 70 i #define VMAJSHIFT 8 Err bitreich.org 70 i #define VMAJMASK 0xff Err bitreich.org 70 i+#define EALGOSHIFT 19 Err bitreich.org 70 i+#define EALGOMASK 0x7 Err bitreich.org 70 i+#define ENONETYPE 0 Err bitreich.org 70 i+#define ECHACHATYPE 1 Err bitreich.org 70 i #define CALGOSHIFT 16 Err bitreich.org 70 i #define CALGOMASK 0x7 Err bitreich.org 70 i #define CNONETYPE 0 Err bitreich.org 70 i@@ -320,6 +324,17 @@ bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ /* Set encryption type */ Err bitreich.org 70 i+ if (strcmp(bpar->ealgo, "none") == 0) { Err bitreich.org 70 i+ bhdr->flags |= ENONETYPE << EALGOSHIFT; Err bitreich.org 70 i+ } else if (strcmp(bpar->ealgo, "XChaCha20-Poly1305") == 0) { Err bitreich.org 70 i+ bhdr->flags |= ECHACHATYPE << EALGOSHIFT; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ free(sctx); Err bitreich.org 70 i+ close(fd); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i bhdr->nbd = 0; Err bitreich.org 70 i sctx->fd = fd; Err bitreich.org 70 i Err bitreich.org 70 i@@ -338,7 +353,7 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i { Err bitreich.org 70 i struct sctx *sctx; Err bitreich.org 70 i struct bhdr *bhdr; Err bitreich.org 70 i- int fd, calgo; Err bitreich.org 70 i+ int fd, algo; Err bitreich.org 70 i Err bitreich.org 70 i switch (flags) { Err bitreich.org 70 i case B_READ: Err bitreich.org 70 i@@ -391,8 +406,8 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* Populate bparam compression algo */ Err bitreich.org 70 i- calgo = (bhdr->flags >> CALGOSHIFT) & CALGOMASK; Err bitreich.org 70 i- switch (calgo) { Err bitreich.org 70 i+ algo = (bhdr->flags >> CALGOSHIFT) & CALGOMASK; Err bitreich.org 70 i+ switch (algo) { Err bitreich.org 70 i case CNONETYPE: Err bitreich.org 70 i bpar->calgo = "none"; Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -405,6 +420,21 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ /* Populate bparam encryption algo */ Err bitreich.org 70 i+ algo = (bhdr->flags >> EALGOSHIFT) & EALGOMASK; Err bitreich.org 70 i+ switch (algo) { Err bitreich.org 70 i+ case ENONETYPE: Err bitreich.org 70 i+ bpar->ealgo = "none"; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case ECHACHATYPE: Err bitreich.org 70 i+ bpar->ealgo = "XChaCha20-Poly1305"; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ free(sctx); Err bitreich.org 70 i+ close(fd); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i sctx->fd = fd; Err bitreich.org 70 i sctx->rdonly = flags == O_RDONLY; Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/config.h b/config.h /scm/dedup/file/config.h.gph bitreich.org 70 i@@ -1,6 +1,7 @@ Err bitreich.org 70 i #define ARCHIVEPATH "archive" Err bitreich.org 70 i #define STORAGEPATH "storage" Err bitreich.org 70 i #define MDSIZE 32 Err bitreich.org 70 i+#define KEYSIZE 32 Err bitreich.org 70 i #define BSIZEAVG ((size_t)(1ul << 21)) Err bitreich.org 70 i #define BSIZEMIN ((size_t)524288) Err bitreich.org 70 i #define BSIZEMAX ((size_t)8388608) Err bitreich.org 70 1diff --git a/dup-check.1 b/dup-check.1 /scm/dedup/file/dup-check.1.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd April 25, 2019 Err bitreich.org 70 i+.Dd May 2, 2019 Err bitreich.org 70 i .Dt DUP-CHECK 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i@@ -7,13 +7,16 @@ Err bitreich.org 70 i .Sh SYNOPSIS Err bitreich.org 70 i .Nm dup-check Err bitreich.org 70 i .Op Fl v Err bitreich.org 70 i+.Op Fl k Ar keyfile Err bitreich.org 70 i .Op Fl r Ar repo Err bitreich.org 70 i .Ar name Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i .Nm Err bitreich.org 70 i checks that a snapshot is internally consistent. Err bitreich.org 70 i .Sh OPTIONS Err bitreich.org 70 i-.Bl -tag -width "-r repo" Err bitreich.org 70 i+.Bl -tag -width "-k keyfile" Err bitreich.org 70 i+.It Fl k Ar keyfile Err bitreich.org 70 i+Path to encryption key. Err bitreich.org 70 i .It Fl r Ar repo Err bitreich.org 70 i Repository directory. Err bitreich.org 70 i By default the current working directory is used. Err bitreich.org 70 1diff --git a/dup-check.c b/dup-check.c /scm/dedup/file/dup-check.c.gph bitreich.org 70 i@@ -2,13 +2,16 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i Err bitreich.org 70 i #include "arg.h" Err bitreich.org 70 i #include "block.h" Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i+#include "key.h" Err bitreich.org 70 i #include "snap.h" Err bitreich.org 70 i Err bitreich.org 70 i int verbose; Err bitreich.org 70 i@@ -32,7 +35,7 @@ check(struct sctx *sctx, struct bctx *bctx) Err bitreich.org 70 i static void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "usage: %s [-v] [-r repo] name\n", argv0); Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-v] [-k keyfile] [-r repo] name\n", argv0); Err bitreich.org 70 i exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -41,12 +44,17 @@ main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i char spath[PATH_MAX]; Err bitreich.org 70 i char bpath[PATH_MAX]; Err bitreich.org 70 i+ unsigned char key[KEYSIZE]; Err bitreich.org 70 i struct sctx *sctx; Err bitreich.org 70 i struct bctx *bctx; Err bitreich.org 70 i struct bparam bpar; Err bitreich.org 70 i+ char *keyfile = NULL; Err bitreich.org 70 i char *repo = "."; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i+ case 'k': Err bitreich.org 70 i+ keyfile = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i case 'r': Err bitreich.org 70 i repo = EARGF(usage()); Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -60,6 +68,21 @@ main(int argc, char *argv[]) Err bitreich.org 70 i if (argc != 1) Err bitreich.org 70 i usage(); Err bitreich.org 70 i Err bitreich.org 70 i+ if (keyfile != NULL) { Err bitreich.org 70 i+ int fd; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd = open(keyfile, O_RDONLY); Err bitreich.org 70 i+ if (fd < 0) Err bitreich.org 70 i+ err(1, "open: %s", keyfile); Err bitreich.org 70 i+ if (loadkey(fd, key, sizeof(key)) < 0) Err bitreich.org 70 i+ errx(1, "loadkey: failed"); Err bitreich.org 70 i+ bpar.key = key; Err bitreich.org 70 i+ if (close(fd) < 0) Err bitreich.org 70 i+ err(1, "close: %s", keyfile); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ bpar.key = NULL; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i if (snprintf(spath, sizeof(spath), "%s/archive/%s", Err bitreich.org 70 i repo, argv[0]) >= sizeof(spath)) Err bitreich.org 70 i errx(1, "snprintf: %s: path too long", spath); Err bitreich.org 70 1diff --git a/dup-gc.1 b/dup-gc.1 /scm/dedup/file/dup-gc.1.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd April 26, 2019 Err bitreich.org 70 i+.Dd May 2, 2019 Err bitreich.org 70 i .Dt DUP-GC 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i@@ -7,6 +7,7 @@ Err bitreich.org 70 i .Sh SYNOPSIS Err bitreich.org 70 i .Nm dup-gc Err bitreich.org 70 i .Op Fl v Err bitreich.org 70 i+.Op Fl k Ar keyfile Err bitreich.org 70 i .Op repo Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i .Nm Err bitreich.org 70 i@@ -15,7 +16,9 @@ If no Err bitreich.org 70 i .Ar repo Err bitreich.org 70 i is specified the current working directory is used. Err bitreich.org 70 i .Sh OPTIONS Err bitreich.org 70 i-.Bl -tag -width "-v" Err bitreich.org 70 i+.Bl -tag -width "-k keyfile" Err bitreich.org 70 i+.It Fl k Ar keyfile Err bitreich.org 70 i+Path to encryption key. Err bitreich.org 70 i .It Fl v Err bitreich.org 70 i Enable verbose mode. Err bitreich.org 70 i .El Err bitreich.org 70 1diff --git a/dup-gc.c b/dup-gc.c /scm/dedup/file/dup-gc.c.gph bitreich.org 70 i@@ -2,13 +2,15 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i #include "arg.h" Err bitreich.org 70 i-#include "config.h" Err bitreich.org 70 i #include "block.h" Err bitreich.org 70 i+#include "config.h" Err bitreich.org 70 i+#include "key.h" Err bitreich.org 70 i #include "snap.h" Err bitreich.org 70 i Err bitreich.org 70 i int verbose; Err bitreich.org 70 i@@ -17,18 +19,23 @@ char *argv0; Err bitreich.org 70 i static void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "usage: %s [repo]\n", argv0); Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-v] [-k keyfile] [repo]\n", argv0); Err bitreich.org 70 i exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i+ unsigned char key[KEYSIZE]; Err bitreich.org 70 i struct bctx *bctx; /* block context */ Err bitreich.org 70 i struct bparam bpar; Err bitreich.org 70 i+ char *keyfile = NULL; Err bitreich.org 70 i char *repo; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i+ case 'k': Err bitreich.org 70 i+ keyfile = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i case 'v': Err bitreich.org 70 i verbose++; Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -47,6 +54,21 @@ main(int argc, char *argv[]) Err bitreich.org 70 i usage(); Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i+ if (keyfile != NULL) { Err bitreich.org 70 i+ int fd; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd = open(keyfile, O_RDONLY); Err bitreich.org 70 i+ if (fd < 0) Err bitreich.org 70 i+ err(1, "open: %s", keyfile); Err bitreich.org 70 i+ if (loadkey(fd, key, sizeof(key)) < 0) Err bitreich.org 70 i+ errx(1, "loadkey: failed"); Err bitreich.org 70 i+ bpar.key = key; Err bitreich.org 70 i+ if (close(fd) < 0) Err bitreich.org 70 i+ err(1, "close: %s", keyfile); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ bpar.key = NULL; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i if (chdir(repo) < 0) Err bitreich.org 70 i err(1, "chdir: %s", repo); Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/dup-init.1 b/dup-init.1 /scm/dedup/file/dup-init.1.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd May 1, 2019 Err bitreich.org 70 i+.Dd May 2, 2019 Err bitreich.org 70 i .Dt DUP-INIT 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i@@ -7,7 +7,8 @@ Err bitreich.org 70 i .Sh SYNOPSIS Err bitreich.org 70 i .Nm dup-init Err bitreich.org 70 i .Op Fl v Err bitreich.org 70 i-.Op Fl Z Ar compressor Err bitreich.org 70 i+.Op Fl E Ar algo Err bitreich.org 70 i+.Op Fl Z Ar algo Err bitreich.org 70 i .Op repo Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i .Nm Err bitreich.org 70 i@@ -16,11 +17,17 @@ If no Err bitreich.org 70 i .Ar repo Err bitreich.org 70 i is specified the current working directory is used. Err bitreich.org 70 i .Sh OPTIONS Err bitreich.org 70 i-.Bl -tag -width "-Z compressor" Err bitreich.org 70 i-.It Fl Z Ar compressor Err bitreich.org 70 i-The compressor function used to compress the blocks Err bitreich.org 70 i+.Bl -tag -width "-Z algo" Err bitreich.org 70 i+.It Fl E Ar algo Err bitreich.org 70 i+The encryption algorithm used to encrypt the blocks Err bitreich.org 70 i in the store. Err bitreich.org 70 i-The supported compressor functions are none and snappy. Err bitreich.org 70 i+The supported encryption algorithms are none and XChaCha20-Poly1305. Err bitreich.org 70 i+This flag only has an effect when initializing the repository. Err bitreich.org 70 i+By default none is used. Err bitreich.org 70 i+.It Fl Z Ar algo Err bitreich.org 70 i+The compressor algorithm used to compress the blocks Err bitreich.org 70 i+in the store. Err bitreich.org 70 i+The supported compressor algorithms are none and snappy. Err bitreich.org 70 i This flag only has an effect when initializing the repository. Err bitreich.org 70 i By default snappy is used. Err bitreich.org 70 i .It Fl v Err bitreich.org 70 1diff --git a/dup-init.c b/dup-init.c /scm/dedup/file/dup-init.c.gph bitreich.org 70 i@@ -17,7 +17,7 @@ char *argv0; Err bitreich.org 70 i static void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "usage: %s [-v] [-Z compressor] [repo]\n", argv0); Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-v] [-E algo] [-Z algo] [repo]\n", argv0); Err bitreich.org 70 i exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -29,8 +29,12 @@ main(int argc, char *argv[]) Err bitreich.org 70 i char *repo; Err bitreich.org 70 i Err bitreich.org 70 i bpar.calgo = bparamdef()->calgo; Err bitreich.org 70 i+ bpar.ealgo = bparamdef()->ealgo; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i+ case 'E': Err bitreich.org 70 i+ bpar.ealgo = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i case 'Z': Err bitreich.org 70 i bpar.calgo = EARGF(usage()); Err bitreich.org 70 i break; Err bitreich.org 70 1diff --git a/dup-keygen.1 b/dup-keygen.1 /scm/dedup/file/dup-keygen.1.gph bitreich.org 70 i@@ -0,0 +1,22 @@ Err bitreich.org 70 i+.Dd May 2, 2019 Err bitreich.org 70 i+.Dt DUP-KEYGEN 1 Err bitreich.org 70 i+.Os Err bitreich.org 70 i+.Sh NAME Err bitreich.org 70 i+.Nm dup-keygen Err bitreich.org 70 i+.Nd Generate dedup encryption key Err bitreich.org 70 i+.Sh SYNOPSIS Err bitreich.org 70 i+.Nm dup-keygen Err bitreich.org 70 i+.Op Fl v Err bitreich.org 70 i+.Ar keyfile Err bitreich.org 70 i+.Sh DESCRIPTION Err bitreich.org 70 i+.Nm Err bitreich.org 70 i+generates a 256-bit encryption key file. Err bitreich.org 70 i+This key is used when operating on an encrypted dedup repository. Err bitreich.org 70 i+.Sh OPTIONS Err bitreich.org 70 i+.Bl -tag -width "keyfile" Err bitreich.org 70 i+.It Fl v Err bitreich.org 70 i+Enable verbose mode. Err bitreich.org 70 i+.El Err bitreich.org 70 i+.Sh AUTHORS Err bitreich.org 70 i+.An Dimitris Papastamos Aq Mt sin@2f30.org , Err bitreich.org 70 i+.An z3bra Aq Mt contactatz3bradotorg . Err bitreich.org 70 1diff --git a/dup-keygen.c b/dup-keygen.c /scm/dedup/file/dup-keygen.c.gph bitreich.org 70 i@@ -0,0 +1,52 @@ 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+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "arg.h" Err bitreich.org 70 i+#include "config.h" Err bitreich.org 70 i+#include "key.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+int verbose; Err bitreich.org 70 i+char *argv0; Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+usage(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-v] keyfile\n", argv0); Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+main(int argc, char *argv[]) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int fd; Err bitreich.org 70 i+ unsigned char key[KEYSIZE]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ARGBEGIN { Err bitreich.org 70 i+ case 'v': Err bitreich.org 70 i+ verbose++; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ } ARGEND Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (argc != 1) Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd = open(argv[0], O_RDWR | O_CREAT | O_EXCL, 0600); Err bitreich.org 70 i+ if (fd < 0) Err bitreich.org 70 i+ err(1, "open: %s", argv[0]); Err bitreich.org 70 i+ if (keygen(key, sizeof(key)) < 0) Err bitreich.org 70 i+ errx(1, "keygen: failed"); Err bitreich.org 70 i+ if (savekey(fd, key, sizeof(key)) < 0) Err bitreich.org 70 i+ errx(1, "savekey: failed"); Err bitreich.org 70 i+ fsync(fd); Err bitreich.org 70 i+ if (close(fd) < 0) Err bitreich.org 70 i+ err(1, "close: %s", argv[0]); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/dup-pack.1 b/dup-pack.1 /scm/dedup/file/dup-pack.1.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd April 25, 2019 Err bitreich.org 70 i+.Dd May 2, 2019 Err bitreich.org 70 i .Dt DUP-PACK 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i@@ -7,6 +7,7 @@ Err bitreich.org 70 i .Sh SYNOPSIS Err bitreich.org 70 i .Nm dup-pack Err bitreich.org 70 i .Op Fl v Err bitreich.org 70 i+.Op Fl k Ar keyfile Err bitreich.org 70 i .Op Fl r Ar repo Err bitreich.org 70 i .Ar name Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i@@ -23,7 +24,9 @@ a directory tree, Err bitreich.org 70 i should be used and piped into Err bitreich.org 70 i .Nm . Err bitreich.org 70 i .Sh OPTIONS Err bitreich.org 70 i-.Bl -tag -width "-r repo" Err bitreich.org 70 i+.Bl -tag -width "-k keyfile" Err bitreich.org 70 i+.It Fl k Ar keyfile Err bitreich.org 70 i+Path to encryption key. Err bitreich.org 70 i .It Fl r Ar repo Err bitreich.org 70 i Repository directory. Err bitreich.org 70 i By default the current working directory is used. Err bitreich.org 70 1diff --git a/dup-pack.c b/dup-pack.c /scm/dedup/file/dup-pack.c.gph bitreich.org 70 i@@ -2,14 +2,17 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i Err bitreich.org 70 i #include "arg.h" Err bitreich.org 70 i #include "block.h" Err bitreich.org 70 i #include "chunker.h" Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i+#include "key.h" Err bitreich.org 70 i #include "snap.h" Err bitreich.org 70 i Err bitreich.org 70 i int verbose; Err bitreich.org 70 i@@ -50,7 +53,7 @@ pack(struct sctx *sctx, struct bctx *bctx) Err bitreich.org 70 i static void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "usage: %s [-v] [-r repo] name\n", argv0); Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-v] [-k keyfile] [-r repo] name\n", argv0); Err bitreich.org 70 i exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -59,12 +62,17 @@ main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i char spath[PATH_MAX]; Err bitreich.org 70 i char bpath[PATH_MAX]; Err bitreich.org 70 i+ unsigned char key[KEYSIZE]; Err bitreich.org 70 i struct sctx *sctx; Err bitreich.org 70 i struct bctx *bctx; Err bitreich.org 70 i struct bparam bpar; Err bitreich.org 70 i+ char *keyfile = NULL; Err bitreich.org 70 i char *repo = "."; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i+ case 'k': Err bitreich.org 70 i+ keyfile = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i case 'r': Err bitreich.org 70 i repo = EARGF(usage()); Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -78,6 +86,21 @@ main(int argc, char *argv[]) Err bitreich.org 70 i if (argc != 1) Err bitreich.org 70 i usage(); Err bitreich.org 70 i Err bitreich.org 70 i+ if (keyfile != NULL) { Err bitreich.org 70 i+ int fd; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd = open(keyfile, O_RDONLY); Err bitreich.org 70 i+ if (fd < 0) Err bitreich.org 70 i+ err(1, "open: %s", keyfile); Err bitreich.org 70 i+ if (loadkey(fd, key, sizeof(key)) < 0) Err bitreich.org 70 i+ errx(1, "loadkey: failed"); Err bitreich.org 70 i+ bpar.key = key; Err bitreich.org 70 i+ if (close(fd) < 0) Err bitreich.org 70 i+ err(1, "close: %s", keyfile); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ bpar.key = NULL; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i if (snprintf(spath, sizeof(spath), "%s/archive/%s", Err bitreich.org 70 i repo, argv[0]) >= sizeof(spath)) Err bitreich.org 70 i errx(1, "snprintf: %s: path too long", spath); Err bitreich.org 70 1diff --git a/dup-rm.1 b/dup-rm.1 /scm/dedup/file/dup-rm.1.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd April 27, 2019 Err bitreich.org 70 i+.Dd May 2, 2019 Err bitreich.org 70 i .Dt DUP-RM 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i@@ -7,6 +7,7 @@ Err bitreich.org 70 i .Sh SYNOPSIS Err bitreich.org 70 i .Nm dup-rm Err bitreich.org 70 i .Op Fl v Err bitreich.org 70 i+.Op Fl k Ar keyfile Err bitreich.org 70 i .Op Fl r Ar repo Err bitreich.org 70 i .Ar name Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i@@ -14,7 +15,9 @@ Err bitreich.org 70 i removes the snapshot specified by Err bitreich.org 70 i .Ar name . Err bitreich.org 70 i .Sh OPTIONS Err bitreich.org 70 i-.Bl -tag -width "-r repo" Err bitreich.org 70 i+.Bl -tag -width "-k keyfile" Err bitreich.org 70 i+.It Fl k Ar keyfile Err bitreich.org 70 i+Path to encryption key. Err bitreich.org 70 i .It Fl r Ar repo Err bitreich.org 70 i Repository directory. Err bitreich.org 70 i By default the current working directory is used. Err bitreich.org 70 1diff --git a/dup-rm.c b/dup-rm.c /scm/dedup/file/dup-rm.c.gph bitreich.org 70 i@@ -2,6 +2,7 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -10,6 +11,7 @@ Err bitreich.org 70 i #include "arg.h" Err bitreich.org 70 i #include "block.h" Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i+#include "key.h" Err bitreich.org 70 i #include "snap.h" Err bitreich.org 70 i Err bitreich.org 70 i int verbose; Err bitreich.org 70 i@@ -33,7 +35,7 @@ rm(struct sctx *sctx, struct bctx *bctx) Err bitreich.org 70 i static void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "usage: %s [-v] [-r repo] name\n", argv0); Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-v] [-k keyfile] [-r repo] name\n", argv0); Err bitreich.org 70 i exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -42,12 +44,17 @@ main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i char spath[PATH_MAX]; Err bitreich.org 70 i char bpath[PATH_MAX]; Err bitreich.org 70 i+ unsigned char key[KEYSIZE]; Err bitreich.org 70 i struct sctx *sctx; Err bitreich.org 70 i struct bctx *bctx; Err bitreich.org 70 i struct bparam bpar; Err bitreich.org 70 i+ char *keyfile = NULL; Err bitreich.org 70 i char *repo = "."; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i+ case 'k': Err bitreich.org 70 i+ keyfile = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i case 'r': Err bitreich.org 70 i repo = EARGF(usage()); Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -61,6 +68,21 @@ main(int argc, char *argv[]) Err bitreich.org 70 i if (argc != 1) Err bitreich.org 70 i usage(); Err bitreich.org 70 i Err bitreich.org 70 i+ if (keyfile != NULL) { Err bitreich.org 70 i+ int fd; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd = open(keyfile, O_RDONLY); Err bitreich.org 70 i+ if (fd < 0) Err bitreich.org 70 i+ err(1, "open: %s", keyfile); Err bitreich.org 70 i+ if (loadkey(fd, key, sizeof(key)) < 0) Err bitreich.org 70 i+ errx(1, "loadkey: failed"); Err bitreich.org 70 i+ bpar.key = key; Err bitreich.org 70 i+ if (close(fd) < 0) Err bitreich.org 70 i+ err(1, "close: %s", keyfile); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ bpar.key = NULL; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i if (snprintf(spath, sizeof(spath), "%s/archive/%s", Err bitreich.org 70 i repo, argv[0]) >= sizeof(spath)) Err bitreich.org 70 i errx(1, "snprintf: %s: path too long", spath); Err bitreich.org 70 1diff --git a/dup-unpack.1 b/dup-unpack.1 /scm/dedup/file/dup-unpack.1.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd April 25, 2019 Err bitreich.org 70 i+.Dd May 2, 2019 Err bitreich.org 70 i .Dt DUP-UNPACK 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i@@ -7,6 +7,7 @@ Err bitreich.org 70 i .Sh SYNOPSIS Err bitreich.org 70 i .Nm dup-unpack Err bitreich.org 70 i .Op Fl v Err bitreich.org 70 i+.Op Fl k Ar keyfile Err bitreich.org 70 i .Op Fl r Ar repo Err bitreich.org 70 i .Ar name Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i@@ -15,7 +16,9 @@ extracts the snapshot specified by Err bitreich.org 70 i .Ar name Err bitreich.org 70 i from the dedup repository and writes the data to stdout. Err bitreich.org 70 i .Sh OPTIONS Err bitreich.org 70 i-.Bl -tag -width "-r repo" Err bitreich.org 70 i+.Bl -tag -width "-k keyfile" Err bitreich.org 70 i+.It Fl k Ar keyfile Err bitreich.org 70 i+Path to encryption key. Err bitreich.org 70 i .It Fl r Ar repo Err bitreich.org 70 i Repository directory. Err bitreich.org 70 i By default the current working directory is used. Err bitreich.org 70 1diff --git a/dup-unpack.c b/dup-unpack.c /scm/dedup/file/dup-unpack.c.gph bitreich.org 70 i@@ -2,6 +2,7 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -10,6 +11,7 @@ Err bitreich.org 70 i #include "arg.h" Err bitreich.org 70 i #include "block.h" Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i+#include "key.h" Err bitreich.org 70 i #include "snap.h" Err bitreich.org 70 i Err bitreich.org 70 i extern ssize_t xwrite(int, void *, size_t); Err bitreich.org 70 i@@ -48,7 +50,7 @@ unpack(struct sctx *sctx, struct bctx *bctx) Err bitreich.org 70 i static void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "usage: %s [-v] [-r repo] name\n", argv0); Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-v] [-k keyfile] [-r repo] name\n", argv0); Err bitreich.org 70 i exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -57,12 +59,17 @@ main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i char spath[PATH_MAX]; Err bitreich.org 70 i char bpath[PATH_MAX]; Err bitreich.org 70 i+ unsigned char key[KEYSIZE]; Err bitreich.org 70 i struct sctx *sctx; Err bitreich.org 70 i struct bctx *bctx; Err bitreich.org 70 i struct bparam bpar; Err bitreich.org 70 i+ char *keyfile; Err bitreich.org 70 i char *repo = "."; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i+ case 'k': Err bitreich.org 70 i+ keyfile = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i case 'r': Err bitreich.org 70 i repo = EARGF(usage()); Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -76,6 +83,21 @@ main(int argc, char *argv[]) Err bitreich.org 70 i if (argc != 1) Err bitreich.org 70 i usage(); Err bitreich.org 70 i Err bitreich.org 70 i+ if (keyfile != NULL) { Err bitreich.org 70 i+ int fd; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fd = open(keyfile, O_RDONLY); Err bitreich.org 70 i+ if (fd < 0) Err bitreich.org 70 i+ err(1, "open: %s", keyfile); Err bitreich.org 70 i+ if (loadkey(fd, key, sizeof(key)) < 0) Err bitreich.org 70 i+ errx(1, "loadkey: failed"); Err bitreich.org 70 i+ bpar.key = key; Err bitreich.org 70 i+ if (close(fd) < 0) Err bitreich.org 70 i+ err(1, "close: %s", keyfile); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ bpar.key = NULL; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i if (snprintf(spath, sizeof(spath), "%s/archive/%s", Err bitreich.org 70 i repo, argv[0]) >= sizeof(spath)) Err bitreich.org 70 i errx(1, "snprintf: %s: path too long", spath); Err bitreich.org 70 1diff --git a/key.c b/key.c /scm/dedup/file/key.c.gph bitreich.org 70 i@@ -0,0 +1,39 @@ 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 "config.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+keygen(unsigned char *key, size_t n) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (n < crypto_aead_xchacha20poly1305_ietf_KEYBYTES) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ assert(KEYSIZE == crypto_aead_xchacha20poly1305_ietf_KEYBYTES); Err bitreich.org 70 i+ if (sodium_init() < 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ crypto_aead_xchacha20poly1305_ietf_keygen(key); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+savekey(int fd, unsigned char *key, size_t n) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (n < crypto_aead_xchacha20poly1305_ietf_KEYBYTES) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ assert(KEYSIZE == crypto_aead_xchacha20poly1305_ietf_KEYBYTES); Err bitreich.org 70 i+ if (write(fd, key, KEYSIZE) != KEYSIZE) Err bitreich.org 70 i+ return -1; 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 i+loadkey(int fd, unsigned char *key, size_t n) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (n < crypto_aead_xchacha20poly1305_ietf_KEYBYTES) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ assert(KEYSIZE == crypto_aead_xchacha20poly1305_ietf_KEYBYTES); Err bitreich.org 70 i+ if (read(fd, key, KEYSIZE) != KEYSIZE) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/key.h b/key.h /scm/dedup/file/key.h.gph bitreich.org 70 i@@ -0,0 +1,3 @@ Err bitreich.org 70 i+extern int keygen(unsigned char *key, size_t n); Err bitreich.org 70 i+extern int savekey(int fd, unsigned char *key, size_t n); Err bitreich.org 70 i+extern int loadkey(int fd, unsigned char *key, size_t n); Err bitreich.org 70 1diff --git a/test006 b/test006 /scm/dedup/file/test006.gph bitreich.org 70 i@@ -0,0 +1,18 @@ Err bitreich.org 70 i+#!/bin/sh Err bitreich.org 70 i+set -ex Err bitreich.org 70 i+ Err bitreich.org 70 i+keyfile=`mktemp -u` Err bitreich.org 70 i+repo=`mktemp -d` Err bitreich.org 70 i+data=`mktemp` Err bitreich.org 70 i+dd if=/dev/urandom of="$data" bs=1M count=64 Err bitreich.org 70 i+./dup-keygen "$keyfile" Err bitreich.org 70 i+./dup-init -E XChaCha20-Poly1305 "$repo" Err bitreich.org 70 i+./dup-pack -k "$keyfile" -r "$repo" snap0 < "$data" Err bitreich.org 70 i+./dup-gc -k "$keyfile" "$repo" Err bitreich.org 70 i+./dup-rm -k "$keyfile" -r "$repo" snap0 < "$data" Err bitreich.org 70 i+./dup-pack -k "$keyfile" -r "$repo" snap0 < "$data" Err bitreich.org 70 i+./dup-gc -k "$keyfile" "$repo" Err bitreich.org 70 i+sum0=`sha1sum "$data" | awk '{print $1}'` Err bitreich.org 70 i+sum1=`./dup-unpack -k "$keyfile" -r "$repo" snap0 | sha1sum | awk '{print $1}'` Err bitreich.org 70 i+[ "$sum0" = "$sum1" ] Err bitreich.org 70 i+rm -rf "$keyfile" "$repo" "$data" Err bitreich.org 70 .