commit a1037d78c0b5a6d557e520a87d484e77168610b9
parent d0213e5514ecb4a49986054e94943ff3016c5766
Author: sin <sin@2f30.org>
Date: Thu, 2 May 2019 23:32:12 +0100
Add -k option to dup-init(1)
Diffstat:
3 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/dup-init.1 b/dup-init.1
@@ -9,6 +9,7 @@
.Op Fl v
.Op Fl E Ar algo
.Op Fl Z Ar algo
+.Op Fl k Ar keyfile
.Op repo
.Sh DESCRIPTION
.Nm
@@ -17,7 +18,7 @@ If no
.Ar repo
is specified the current working directory is used.
.Sh OPTIONS
-.Bl -tag -width "-Z algo"
+.Bl -tag -width "-k keyfile"
.It Fl E Ar algo
The encryption algorithm used to encrypt the blocks
in the store.
@@ -30,6 +31,8 @@ in the store.
The supported compressor algorithms are none and snappy.
This flag only has an effect when initializing the repository.
By default snappy is used.
+.It Fl k Ar keyfile
+Path to encryption key.
.It Fl v
Enable verbose mode.
.El
diff --git a/dup-init.c b/dup-init.c
@@ -2,13 +2,15 @@
#include <sys/stat.h>
#include <err.h>
+#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "arg.h"
-#include "config.h"
#include "block.h"
+#include "config.h"
+#include "key.h"
#include "snap.h"
int verbose;
@@ -17,21 +19,26 @@ char *argv0;
static void
usage(void)
{
- fprintf(stderr, "usage: %s [-v] [-E algo] [-Z algo] [repo]\n", argv0);
+ fprintf(stderr, "usage: %s [-v] [-E algo] [-Z algo] [-k keyfile] [repo]\n", argv0);
exit(1);
}
int
main(int argc, char *argv[])
{
+ unsigned char key[KEYSIZE];
struct bctx *bctx; /* block context */
struct bparam bpar;
+ char *keyfile = NULL;
char *repo;
bpar.calgo = bparamdef()->calgo;
bpar.ealgo = bparamdef()->ealgo;
ARGBEGIN {
+ case 'k':
+ keyfile = EARGF(usage());
+ break;
case 'E':
bpar.ealgo = EARGF(usage());
break;
@@ -56,6 +63,21 @@ main(int argc, char *argv[])
usage();
};
+ if (keyfile != NULL) {
+ int fd;
+
+ fd = open(keyfile, O_RDONLY);
+ if (fd < 0)
+ err(1, "open: %s", keyfile);
+ if (loadkey(fd, key, sizeof(key)) < 0)
+ errx(1, "loadkey: failed");
+ bpar.key = key;
+ if (close(fd) < 0)
+ err(1, "close: %s", keyfile);
+ } else {
+ bpar.key = NULL;
+ }
+
mkdir(repo, 0700);
if (chdir(repo) < 0)
err(1, "chdir: %s", repo);
diff --git a/test006 b/test006
@@ -6,7 +6,7 @@ repo=`mktemp -d`
data=`mktemp`
dd if=/dev/urandom of="$data" bs=1M count=64
./dup-keygen "$keyfile"
-./dup-init -E XChaCha20-Poly1305 "$repo"
+./dup-init -E XChaCha20-Poly1305 -k "$keyfile" "$repo"
./dup-pack -k "$keyfile" -r "$repo" snap0 < "$data"
./dup-gc -k "$keyfile" "$repo"
./dup-rm -k "$keyfile" -r "$repo" snap0 < "$data"