LCOV - code coverage report
Current view: top level - zephyr/bluetooth - ead.h Coverage Total Hit
Test: new.info Lines: 88.9 % 9 8
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            0 : /* Copyright (c) 2023 Nordic Semiconductor ASA
       2              :  * SPDX-License-Identifier: Apache-2.0
       3              :  */
       4              : 
       5              : #include <stddef.h>
       6              : #include <stdint.h>
       7              : 
       8              : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_EAD_H_
       9              : #define ZEPHYR_INCLUDE_BLUETOOTH_EAD_H_
      10              : 
      11              : #include <zephyr/bluetooth/bluetooth.h>
      12              : #include <zephyr/kernel.h>
      13              : 
      14              : #ifdef __cplusplus
      15              : extern "C" {
      16              : #endif
      17              : 
      18              : /**
      19              :  * @brief Encrypted Advertising Data (EAD)
      20              :  * @defgroup bt_ead Encrypted Advertising Data (EAD)
      21              :  * @ingroup bluetooth
      22              :  * @{
      23              :  */
      24              : 
      25              : /** Randomizer size in bytes */
      26            1 : #define BT_EAD_RANDOMIZER_SIZE 5
      27              : /** Key size in bytes */
      28            1 : #define BT_EAD_KEY_SIZE        16
      29              : /** Initialisation Vector size in bytes */
      30            1 : #define BT_EAD_IV_SIZE         8
      31              : /** MIC size in bytes */
      32            1 : #define BT_EAD_MIC_SIZE        4
      33              : 
      34              : /** Get the size (in bytes) of the encrypted advertising data for a given
      35              :  *  payload size in bytes.
      36              :  */
      37            1 : #define BT_EAD_ENCRYPTED_PAYLOAD_SIZE(payload_size)                                                \
      38              :         ((payload_size) + BT_EAD_RANDOMIZER_SIZE + BT_EAD_MIC_SIZE)
      39              : 
      40              : /** Get the size (in bytes) of the decrypted payload for a given payload size in
      41              :  *  bytes.
      42              :  */
      43            1 : #define BT_EAD_DECRYPTED_PAYLOAD_SIZE(encrypted_payload_size)                                      \
      44              :         ((encrypted_payload_size) - (BT_EAD_RANDOMIZER_SIZE + BT_EAD_MIC_SIZE))
      45              : 
      46              : /**
      47              :  * @brief Encrypt and authenticate the given advertising data.
      48              :  *
      49              :  * The resulting data in @p encrypted_payload will look like that:
      50              :  * - Randomizer is added in the @ref BT_EAD_RANDOMIZER_SIZE first bytes;
      51              :  * - Encrypted payload is added ( @p payload_size bytes);
      52              :  * - MIC is added in the last @ref BT_EAD_MIC_SIZE bytes.
      53              :  *
      54              :  * @attention The function must be called each time the RPA is updated or the
      55              :  * data are modified.
      56              :  *
      57              :  * @note The term `advertising structure` is used to describe the advertising
      58              :  *       data with the advertising type and the length of those two.
      59              :  *
      60              :  * @param[in]  session_key Key of @ref BT_EAD_KEY_SIZE bytes used for the
      61              :  *             encryption.
      62              :  * @param[in]  iv Initialisation Vector used to generate the nonce. It must be
      63              :  *             changed each time the Session Key changes.
      64              :  * @param[in]  payload Advertising Data to encrypt. Can be multiple advertising
      65              :  *             structures that are concatenated.
      66              :  * @param[in]  payload_size Size of the Advertising Data to encrypt.
      67              :  * @param[out] encrypted_payload Encrypted Ad Data including the Randomizer and
      68              :  *             the MIC. Size must be at least @ref BT_EAD_RANDOMIZER_SIZE + @p
      69              :  *             payload_size + @ref BT_EAD_MIC_SIZE. Use @ref
      70              :  *             BT_EAD_ENCRYPTED_PAYLOAD_SIZE to get the right size.
      71              :  *
      72              :  * @retval 0 Data have been correctly encrypted and authenticated.
      73              :  * @retval -EIO Error occurred during the encryption or the authentication.
      74              :  * @retval -EINVAL One of the argument is a NULL pointer.
      75              :  * @retval -ECANCELED Error occurred during the random number generation.
      76              :  */
      77            1 : int bt_ead_encrypt(const uint8_t session_key[BT_EAD_KEY_SIZE], const uint8_t iv[BT_EAD_IV_SIZE],
      78              :                    const uint8_t *payload, size_t payload_size, uint8_t *encrypted_payload);
      79              : 
      80              : /**
      81              :  * @brief Decrypt and authenticate the given encrypted advertising data.
      82              :  *
      83              :  * @note The term `advertising structure` is used to describe the advertising
      84              :  *       data with the advertising type and the length of those two.
      85              :  *
      86              :  * @param[in]  session_key Key of 16 bytes used for the encryption.
      87              :  * @param[in]  iv Initialisation Vector used to generate the `nonce`.
      88              :  * @param[in]  encrypted_payload Encrypted Advertising Data received. This
      89              :  *             should only contain the advertising data from the received
      90              :  *             advertising structure, not the length nor the type.
      91              :  * @param[in]  encrypted_payload_size Size of the received advertising data in
      92              :  *             bytes. Should be equal to the length field of the received
      93              :  *             advertising structure, minus the size of the type (1 byte).
      94              :  * @param[out] payload Decrypted advertising payload. Use @ref
      95              :  *             BT_EAD_DECRYPTED_PAYLOAD_SIZE to get the right size.
      96              :  *
      97              :  * @retval 0 Data have been correctly decrypted and authenticated.
      98              :  * @retval -EIO Error occurred during the decryption or the authentication.
      99              :  * @retval -EINVAL One of the argument is a NULL pointer or @p
     100              :  *                 encrypted_payload_size is less than @ref
     101              :  *                 BT_EAD_RANDOMIZER_SIZE + @ref BT_EAD_MIC_SIZE.
     102              :  */
     103            1 : int bt_ead_decrypt(const uint8_t session_key[BT_EAD_KEY_SIZE], const uint8_t iv[BT_EAD_IV_SIZE],
     104              :                    const uint8_t *encrypted_payload, size_t encrypted_payload_size,
     105              :                    uint8_t *payload);
     106              : 
     107              : /**
     108              :  * @}
     109              :  */
     110              : 
     111              : #ifdef __cplusplus
     112              : }
     113              : #endif
     114              : 
     115              : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_EAD_H_ */
        

Generated by: LCOV version 2.0-1