]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Add option to read passphrase from a keyfile
authorOz Tiram <oz.tiram@gmail.com>
Mon, 15 Jan 2024 14:40:02 +0000 (15:40 +0100)
committerOz Tiram <oz.tiram@gmail.com>
Thu, 18 Jan 2024 10:53:12 +0000 (11:53 +0100)
Similar to the same option with luks. Ofcourse,
one can simply wrap bcachefs tool with a script and expect,
but this is a nicer way of doing things.

Signed-off-by: Oz Tiram <oz.tiram@gmail.com>
c_src/cmd_key.c

index 96206c4c36b5a62cce4cc27fd445a383bdfa87df..d66ac7c5b3c567d8f54ff1ca62c6be04e0b139bf 100644 (file)
@@ -1,4 +1,5 @@
 #include <errno.h>
+#include <fcntl.h>
 #include <unistd.h>
 #include <uuid/uuid.h>
 
@@ -6,6 +7,7 @@
 #include "libbcachefs/checksum.h"
 #include "crypto.h"
 #include "libbcachefs.h"
+#include "tools-util.h"
 
 static void unlock_usage(void)
 {
@@ -16,6 +18,7 @@ static void unlock_usage(void)
             "  -c                     Check if a device is encrypted\n"
             "  -k (session|user|user_session)\n"
             "                         Keyring to add to (default: user)\n"
+            "  -f                     Keyfile to read from (disables password prompt)\n"
             "  -h                     Display this help and exit\n"
             "Report bugs to <linux-bcachefs@vger.kernel.org>");
 }
@@ -24,9 +27,12 @@ int cmd_unlock(int argc, char *argv[])
 {
        const char *keyring = "user";
        bool check = false;
+       const char *key_file_path = NULL;
+       char *passphrase = NULL;
+
        int opt;
 
-       while ((opt = getopt(argc, argv, "ck:h")) != -1)
+       while ((opt = getopt(argc, argv, "cf:k:h")) != -1)
                switch (opt) {
                case 'c':
                        check = true;
@@ -34,6 +40,9 @@ int cmd_unlock(int argc, char *argv[])
                case 'k':
                        keyring = strdup(optarg);
                        break;
+               case 'f':
+                       key_file_path = strdup(optarg);
+                       break;
                case 'h':
                        unlock_usage();
                        exit(EXIT_SUCCESS);
@@ -62,8 +71,11 @@ int cmd_unlock(int argc, char *argv[])
 
        if (check)
                exit(EXIT_SUCCESS);
-
-       char *passphrase = read_passphrase("Enter passphrase: ");
+       if (key_file_path){
+               passphrase = read_file_str(AT_FDCWD, key_file_path);
+       } else {
+               passphrase = read_passphrase("Enter passphrase: ");
+       }
 
        bch2_add_key(sb.sb, "user", keyring, passphrase);