Re: [PATCH BlueZ 2/2] device: Update local and remote CSRK on management event

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Frédéric,

On Tue, Jan 23, 2024 at 10:00 AM Frédéric Danis
<frederic.danis@xxxxxxxxxxxxx> wrote:
>
> Hi Luiz,
>
> On 23/01/2024 14:53, Luiz Augusto von Dentz wrote:
> > Hi Frédéric,
> >
> > On Tue, Jan 23, 2024 at 7:15 AM Frédéric Danis
> > <frederic.danis@xxxxxxxxxxxxx> wrote:
> >> The local and remote CSRK keys are only loaded from storage during start.
> >>
> >> Those keys should be updated on MGMT_EV_NEW_CSRK event to be able to
> >> perform signed write for GAP/SEC/CSIGN/BV-02-C.
> >> ---
> >>   src/adapter.c |  2 ++
> >>   src/device.c  | 16 ++++++++++++++++
> >>   src/device.h  |  2 ++
> >>   3 files changed, 20 insertions(+)
> >>
> >> diff --git a/src/adapter.c b/src/adapter.c
> >> index 022390f0d..fb71ef83e 100644
> >> --- a/src/adapter.c
> >> +++ b/src/adapter.c
> >> @@ -8882,6 +8882,8 @@ static void new_csrk_callback(uint16_t index, uint16_t length,
> >>                  return;
> >>          }
> >>
> >> +       device_set_csrk(device, key->val, key->type & 0x01);
> >> +
> >>          if (!ev->store_hint)
> >>                  return;
> >>
> >> diff --git a/src/device.c b/src/device.c
> >> index 17bcfbc49..34f64ca5b 100644
> >> --- a/src/device.c
> >> +++ b/src/device.c
> >> @@ -1955,6 +1955,22 @@ bool btd_device_get_ltk(struct btd_device *device, uint8_t key[16],
> >>          return true;
> >>   }
> >>
> >> +void device_set_csrk(struct btd_device *device, const uint8_t val[16],
> >> +                               bool remote)
> >> +{
> >> +       if (remote) {
> >> +               g_free(device->remote_csrk);
> >> +               device->remote_csrk = g_new0(struct csrk_info, 1);
> >> +               memcpy(device->remote_csrk->key, val,
> >> +                      sizeof(device->remote_csrk->key));
> >> +       } else {
> >> +               g_free(device->local_csrk);
> >> +               device->local_csrk = g_new0(struct csrk_info, 1);
> >> +               memcpy(device->local_csrk->key, val,
> >> +                      sizeof(device->local_csrk->key));
> >> +       }
> >> +}
> >> +
> >>   static bool match_sirk(const void *data, const void *match_data)
> >>   {
> >>          const struct sirk_info *sirk = data;
> >> diff --git a/src/device.h b/src/device.h
> >> index 8bb38669d..d00c002c3 100644
> >> --- a/src/device.h
> >> +++ b/src/device.h
> >> @@ -134,6 +134,8 @@ void device_set_ltk(struct btd_device *device, const uint8_t val[16],
> >>                                  bool central, uint8_t enc_size);
> >>   bool btd_device_get_ltk(struct btd_device *device, uint8_t val[16],
> >>                                  bool *central, uint8_t *enc_size);
> >> +void device_set_csrk(struct btd_device *device, const uint8_t val[16],
> >> +                               bool remote);
> > Looks like there is only one use of this function and it is always set
> > for the remote, actually the fact that this is on the device object
> > already means it is for the remote so I wonder if we really need to
> > store the local as well?
>
> As device is able to store and load both keys from storage I think it
> could be better to keep them in sync, no?

Don't we have the CSRK stored at adapter level though? Or we have to
generate a pair of local/remote CSRK for each device, if we do I'm not
seeing when we store the local CSRK.

> >>   bool btd_device_add_set(struct btd_device *device, bool encrypted,
> >>                                  uint8_t sirk[16], uint8_t size, uint8_t rank);
> >>   void device_store_svc_chng_ccc(struct btd_device *device, uint8_t bdaddr_type,
> >> --
> >> 2.34.1
> >>
> >>
> >
>
> --
> Frédéric Danis
> Senior Software Engineer
>
> Collabora Ltd.
> Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, United Kingdom
> Registered in England & Wales, no. 5513718
>


-- 
Luiz Augusto von Dentz





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux