Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1660702 > unrolled thread

Re: [PATCH v4 12/13] bluetooth/smp: ensure RNG is properly seeded before ECDH use

Started byTheodore Ts'o <tytso@mit.edu>
First post2017-06-08 05:10 +0200
Last post2017-06-09 03:20 +0200
Articles 7 — 3 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  Re: [PATCH v4 12/13] bluetooth/smp: ensure RNG is properly seeded  before ECDH use Theodore Ts'o <tytso@mit.edu> - 2017-06-08 05:10 +0200
    Re: [PATCH v4 12/13] bluetooth/smp: ensure RNG is properly seeded  before ECDH use Marcel Holtmann <marcel@holtmann.org> - 2017-06-08 07:10 +0200
      Re: [PATCH v4 12/13] bluetooth/smp: ensure RNG is properly seeded  before ECDH use "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-06-08 14:10 +0200
      Re: [PATCH v4 12/13] bluetooth/smp: ensure RNG is properly seeded  before ECDH use "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-06-08 14:10 +0200
        Re: [PATCH v4 12/13] bluetooth/smp: ensure RNG is properly seeded  before ECDH use Marcel Holtmann <marcel@holtmann.org> - 2017-06-08 19:10 +0200
          Re: [PATCH v4 12/13] bluetooth/smp: ensure RNG is properly seeded  before ECDH use "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-06-08 19:40 +0200
            [PATCH] bluetooth: ensure RNG is properly seeded before powerup "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-06-09 03:20 +0200

#1660702 — Re: [PATCH v4 12/13] bluetooth/smp: ensure RNG is properly seeded before ECDH use

FromTheodore Ts'o <tytso@mit.edu>
Date2017-06-08 05:10 +0200
SubjectRe: [PATCH v4 12/13] bluetooth/smp: ensure RNG is properly seeded before ECDH use
Message-ID<tPVZD-76l-9@gated-at.bofh.it>
On Tue, Jun 06, 2017 at 07:48:03PM +0200, Jason A. Donenfeld wrote:
> This protocol uses lots of complex cryptography that relies on securely
> generated random numbers. Thus, it's important that the RNG is actually
> seeded before use. Fortuantely, it appears we're always operating in
> process context (there are many GFP_KERNEL allocations and other
> sleeping operations), and so we can simply demand that the RNG is seeded
> before we use it.
> 
> We take two strategies in this commit. The first is for the library code
> that's called from other modules like hci or mgmt: here we just change
> the call to get_random_bytes_wait, and return the result of the wait to
> the caller, along with the other error codes of those functions like
> usual. Then there's the SMP protocol handler itself, which makes many
> many many calls to get_random_bytes during different phases. For this,
> rather than have to change all the calls to get_random_bytes_wait and
> propagate the error result, it's actually enough to just put a single
> call to wait_for_random_bytes() at the beginning of the handler, to
> ensure that all the subsequent invocations are safe, without having to
> actually change them. Likewise, for the random address changing
> function, we'd rather know early on in the function whether the RNG
> initialization has been interrupted, rather than later, so we call
> wait_for_random_bytes() at the top, so that later on the call to
> get_random_bytes() is acceptable.

Do we need to do all of this?  Bluetooth folks, is it fair to assume
that hci_power_on() has to be called before any bluetooth functions
can be done?  If so, adding a wait_for_random_bytes() in
hci_power_on() might be all that is necessary.

	       	     	    	    - Ted

[toc] | [next] | [standalone]


#1660741

FromMarcel Holtmann <marcel@holtmann.org>
Date2017-06-08 07:10 +0200
Message-ID<tPXRL-8na-5@gated-at.bofh.it>
In reply to#1660702
Hi Ted,

>> This protocol uses lots of complex cryptography that relies on securely
>> generated random numbers. Thus, it's important that the RNG is actually
>> seeded before use. Fortuantely, it appears we're always operating in
>> process context (there are many GFP_KERNEL allocations and other
>> sleeping operations), and so we can simply demand that the RNG is seeded
>> before we use it.
>> 
>> We take two strategies in this commit. The first is for the library code
>> that's called from other modules like hci or mgmt: here we just change
>> the call to get_random_bytes_wait, and return the result of the wait to
>> the caller, along with the other error codes of those functions like
>> usual. Then there's the SMP protocol handler itself, which makes many
>> many many calls to get_random_bytes during different phases. For this,
>> rather than have to change all the calls to get_random_bytes_wait and
>> propagate the error result, it's actually enough to just put a single
>> call to wait_for_random_bytes() at the beginning of the handler, to
>> ensure that all the subsequent invocations are safe, without having to
>> actually change them. Likewise, for the random address changing
>> function, we'd rather know early on in the function whether the RNG
>> initialization has been interrupted, rather than later, so we call
>> wait_for_random_bytes() at the top, so that later on the call to
>> get_random_bytes() is acceptable.
> 
> Do we need to do all of this?  Bluetooth folks, is it fair to assume
> that hci_power_on() has to be called before any bluetooth functions
> can be done?  If so, adding a wait_for_random_bytes() in
> hci_power_on() might be all that is necessary.

yes, there are plenty of commands needed before a controller becomes usable. When plugging in new Bluetooth hardware, we have to power it up and read the initial settings and configuration out of.

Also all the cryptographic features only apply to LE enabled controllers. The classic BR/EDR controllers have this all in hardware. So if you are not LE enabled, then there is not even a point in waiting for any seeding. However that said, also all LE controllers have an extra random number function we could call if we need extra seeding. We never bothered to hook this up since we thought that the kernel has enough sources.

Regards

Marcel

[toc] | [prev] | [next] | [standalone]


#1661090

From"Jason A. Donenfeld" <Jason@zx2c4.com>
Date2017-06-08 14:10 +0200
Message-ID<tQ4qd-45j-5@gated-at.bofh.it>
In reply to#1660741
On Thu, Jun 8, 2017 at 7:04 AM, Marcel Holtmann <marcel@holtmann.org> wrote:
>> Do we need to do all of this?  Bluetooth folks, is it fair to assume
>> that hci_power_on() has to be called before any bluetooth functions
>> can be done?  If so, adding a wait_for_random_bytes() in
>> hci_power_on() might be all that is necessary.

Maybe, but that could hassle bluetooth users who don't want to use any
of the fancy bluetooth crypto and don't want to bother waiting for
their RNG to initialize.

[toc] | [prev] | [next] | [standalone]


#1661096

From"Jason A. Donenfeld" <Jason@zx2c4.com>
Date2017-06-08 14:10 +0200
Message-ID<tQ4qe-45j-21@gated-at.bofh.it>
In reply to#1660741
Hello Marcel,

On Thu, Jun 8, 2017 at 7:04 AM, Marcel Holtmann <marcel@holtmann.org> wrote:
> yes, there are plenty of commands needed before a controller becomes usable.

That doesn't clearly address with precision what Ted was wondering.
Specifically, the inquiry is: can you confirm with certainty whether
or not all calls to get_random_bytes() in the bluetooth directory are
*necessarily* going to come after a call to hci_power_on()?

Jason

[toc] | [prev] | [next] | [standalone]


#1661497

FromMarcel Holtmann <marcel@holtmann.org>
Date2017-06-08 19:10 +0200
Message-ID<tQ96x-73e-13@gated-at.bofh.it>
In reply to#1661096
Hi Jason,

>> yes, there are plenty of commands needed before a controller becomes usable.
> 
> That doesn't clearly address with precision what Ted was wondering.
> Specifically, the inquiry is: can you confirm with certainty whether
> or not all calls to get_random_bytes() in the bluetooth directory are
> *necessarily* going to come after a call to hci_power_on()?

on a powered down controller, you can not do any crypto. SMP is only during a connection and the RPAs are only generated when needed. So yes, doing this once in hci_power_on is plenty. However we might want to limit this to LE capable controllers since for BR/EDR only controllers this is not needed. For A2MP I need to check that we need the random numbers seeded there. However this hidden behind the high speed feature.

Regards

Marcel

[toc] | [prev] | [next] | [standalone]


#1661517

From"Jason A. Donenfeld" <Jason@zx2c4.com>
Date2017-06-08 19:40 +0200
Message-ID<tQ9zA-7f5-15@gated-at.bofh.it>
In reply to#1661497
On Thu, Jun 8, 2017 at 7:05 PM, Marcel Holtmann <marcel@holtmann.org> wrote:
> on a powered down controller, you can not do any crypto. SMP is only during a connection and the RPAs are only generated when needed. So yes, doing this once in hci_power_on is plenty. However we might want to limit this to LE capable controllers since for BR/EDR only controllers this is not needed. For A2MP I need to check that we need the random numbers seeded there. However this hidden behind the high speed feature.

Okay so it sounds like certain controllers will use this and certain
won't, and so it might be slightly complicated to follow the mouse
through the tube ideally. In that case, I'd recommend continuing with
this current patchset, which just adds the wait (which is a no-op if
it's already seeded) close to the actual call sites.

Can you review that patch and give your Signed-off-by if it looks good?

Jason

[toc] | [prev] | [next] | [standalone]


#1661850 — [PATCH] bluetooth: ensure RNG is properly seeded before powerup

From"Jason A. Donenfeld" <Jason@zx2c4.com>
Date2017-06-09 03:20 +0200
Subject[PATCH] bluetooth: ensure RNG is properly seeded before powerup
Message-ID<tQgKJ-3le-9@gated-at.bofh.it>
In reply to#1661517
The SMP protocol uses lots of complex cryptography that relies on securely
generated random numbers. Thus, it's important that the RNG is actually
seeded before use. Ted and the bluetooth maintainers seem to think that
it's sufficient to wait_for_random_bytes before powering up, and this
will ensure that all subsequent get_random_bytes calls occur after this
single wait_for_random_bytes. (I'm not completely convinced, but time
will tell.) Therefore, we put this call to wait_for_random_bytes, which
is running in a workqueue, so it can sleep while waiting. We also are
required to pass the potential error code back through the failure
setter, like the rest of the function does.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Cc: Marcel Holtmann <marcel@holtmann.org>
Cc: Gustavo Padovan <gustavo@padovan.org>
Cc: Johan Hedberg <johan.hedberg@gmail.com>
---
Ted -- this would be instead of my other bluetooth patch. I think my other
one might be a bit more robust, but if you prefer this strategy instead,
here's the code for it.

 net/bluetooth/hci_core.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 05686776a5fb..d940e22f365d 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2017,6 +2017,18 @@ static void hci_power_on(struct work_struct *work)
 
 	BT_DBG("%s", hdev->name);
 
+	/* Bluetooth is a big user of cryptography and thus needs to have a
+	 * good random number generator, especially for the SMP protocol.
+	 * Thus, we ensure we have good randomness before powering up.
+	 */
+	err = wait_for_random_bytes();
+	if (err < 0) {
+		hci_dev_lock(hdev);
+		mgmt_set_powered_failed(hdev, err);
+		hci_dev_unlock(hdev);
+		return;
+	}
+
 	if (test_bit(HCI_UP, &hdev->flags) &&
 	    hci_dev_test_flag(hdev, HCI_MGMT) &&
 	    hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) {
-- 
2.13.1

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web