From: Chris X Edwards <chris@xed.ch>
To: cryptsetup@lists.linux.dev
Subject: Re: Can AddKey not use stdin for the new key?
Date: Thu, 24 Aug 2023 11:06:33 -0400 [thread overview]
Message-ID: <ZOdx+Z5dq9wjD54E@xed.ch> (raw)
In-Reply-To: <20230824105155.GA24581@tansi.org>
Hi,
Thanks for the reply. I did see this in the man page. Am I right to
assume this suggestion doesn't relate to the "how much time" aspect of
this passage? This leaves the much more treacherous formatting details
between the input modes. Certainly a cause for concern. The reason I
concluded this was an unlikely cause is that the Remove works as I
would imagine (with a piped key) and the Add does not.
Another check is to go with a very simple passphrase key that can not
possibly have newline entanglements. (That's the goal, correct me if I'm
wrong.) We can start with a very simple key file.
echo "simple" > simplekey
Let's try just the file.
cryptsetup luksAddKey /dev/sdb --new-keyfile simplekey --new-key-slot 1
Enter any existing passphrase:
Works fine. (Passphrase to add is for existing slot 0 as desired.) Now
removing it.
cat simplekey | cryptsetup luksRemoveKey /dev/sdb -
Works fine. Now try adding again but with piping instead of the file.
cat simplekey | cryptsetup luksAddKey /dev/sdb --new-keyfile - --new-key-slot 1
No key available with this passphrase.
And fail.
This may be a basic limitation of what is possible, but I'm just
trying to establish that fact clearly so I can give up on my dream of
using cryptsetup in the elegant way I imagine it can be used. :-)
Thanks,
Chris
On 2023-08-24 12:51 +0200, Arno Wagner wrote:
> the convengtion for reading passphrases from file and from stdin
> are different.
>
> Very likely your passphrase runs into these differences.
>
> From "man cryptsetup":
>
> NOTES ON PASSPHRASE PROCESSING FOR LUKS
> LUKS uses PBKDF2 to protect against dictionary attacks and to give some
> protection to low-entropy passphrases (see RFC 2898 and the cryptsetup
> FAQ).
>
> From a terminal: The passphrase is read until the first newline and
> then processed by PBKDF2 without the newline character.
>
> From stdin: LUKS will read passphrases from stdin up to the first new‐
> line character or the compiled-in maximum key file length. If --key‐
> file-size is given, it is ignored.
>
> From key file: The complete keyfile is read up to the compiled-in maxi‐
> mum size. Newline characters do not terminate the input. The --key‐
> file-size option can be used to limit what is read.
>
> Passphrase processing: Whenever a passphrase is added to a LUKS header
> (luksAddKey, luksFormat), the user may specify how much the time the
> passphrase processing should consume. The time is used to determine the
> iteration count for PBKDF2 and higher times will offer better protec‐
> tion for low-entropy passphrases, but open will take longer to com‐
> plete. For passphrases that have entropy higher than the used key
> length, higher iteration times will not increase security.
>
> The default setting of one second is sufficient for most practical
> cases. The only exception is a low-entropy passphrase used on a device
> with a slow CPU, as this will result in a low iteration count. On a
> slow device it may be advisable to increase the iteration time using
> the --iter-time option in order to obtain a higher iteration count.
> This does slow down all later luksOpen operations accordingly.
>
> On Thu, Aug 24, 2023 at 11:51:09 CEST, Chris X Edwards wrote:
> > Hi,
> >
> > I'm looking for some clarification into why what I'm attempting does
> > not work.
> >
> > What I'd like to do is have a large number of (e.g. regular backup)
> > drives all encrypted with the same key; I don't want to type a
> > password every time I connect one so it would be great if I could have
> > some kind of SSH-like agent. I believe GPG has such a thing. So...
> >
> > I create an encrypted secret that I only have to unlock once:
> >
> > dd if=/dev/urandom bs=512 count=1 | gpg --symmetric --output drivekey.gpg
> >
> > Now I'd like to add that to a LUKS keyslot so that the following
> > works.
> >
> > gpg --decrypt drivekey.gpg | cryptsetup luksOpen --key-file=- /dev/sdb backup
> >
> > When I add the key like this, it (this luksAddKey command and the
> > previous luksOpen) does all work.
> >
> > gpg --decrypt drivekey.gpg > INSECUREdrivekey
> > cryptsetup luksAddKey /dev/sdb --new-keyfile INSECUREdrivekey --new-key-slot 1
> > rm INSECUREdrivekey
> >
> > This asks for a passphrase for one of the existing slots as I'd
> > expect. However, I'd like to avoid that insecure part with something
> > like this.
> >
> > gpg --decrypt drivekey.gpg | cryptsetup luksAddKey /dev/sdb --new-keyfile - --new-key-slot 1
> >
> > This does not work. I was hoping it would still ask for a passphrase
> > of an existing slot. But it just complains of "No key available with
> > this passphrase."
> >
> > What's also interesting is that _removing_ the key works exactly how I
> > think it should.
> >
> > gpg --decrypt drivekey.gpg | cryptsetup luksRemoveKey /dev/sdb -
> >
> > Am I misunderstanding the syntax? Is there a way to have the
> > `luksAddKey` command accept the new key on stdin while verifying that
> > it can be added by typing a passphrase? Maybe manual passphrase and
> > stdin mixing is too confusing. Obviously I can work around it but I'm
> > now curious.
> >
> > Thanks!
--
++++++++++[>++++++++++++<-]>-...<++++++[>>+++++++<<-]>>++++.<+.<++++[>
Chris X Edwards-----<-]>+.- Have a nice day. >.<-.+++++><chris@xed.ch>
next prev parent reply other threads:[~2023-08-24 15:06 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-24 9:51 Can AddKey not use stdin for the new key? Chris X Edwards
2023-08-24 10:51 ` Arno Wagner
2023-08-24 15:06 ` Chris X Edwards [this message]
2023-08-24 15:23 ` Arno Wagner
2023-08-24 15:54 ` Chris X Edwards
2023-08-24 19:16 ` Arno Wagner
2023-08-25 7:51 ` Milan Broz
2023-08-24 17:27 ` Michael Kjörling
2023-08-24 18:35 ` Chris X Edwards
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZOdx+Z5dq9wjD54E@xed.ch \
--to=chris@xed.ch \
--cc=cryptsetup@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox