| /* |
| * Copyright (c) 2019 Bose Corporation |
| * Copyright (c) 2021 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <stddef.h> |
| #include <zephyr/types.h> |
| |
| #include <zephyr/bluetooth/audio/csis.h> |
| |
| #define BT_CSIS_CRYPTO_KEY_SIZE 16 |
| #define BT_CSIS_CRYPTO_SALT_SIZE 16 |
| |
| /** |
| * @brief Private Set Unique identifier hash function sih. |
| * |
| * The RSI hash function sih is used to generate a hash value that is |
| * used in RSIs - Used by the Coordinated Set Identification service and |
| * profile. |
| * |
| * @param sirk The 16-byte SIRK |
| * @param r 3 byte random value |
| * @param out The 3 byte output buffer |
| * @return int 0 on success, any other value indicates a failure. |
| */ |
| int bt_csis_sih(const uint8_t sirk[BT_CSIS_SET_SIRK_SIZE], uint32_t r, |
| uint32_t *out); |
| |
| /** |
| * @brief SIRK encryption function sef |
| * |
| * The SIRK encryption function sef is used by the server to encrypt the SIRK |
| * with a key K. The value of K depends on the transport on which the pairing |
| * between the client and the server was performed. |
| * |
| * If the pairing was performed on BR/EDR, K is equal to the Link Key shared by |
| * the server and the client. |
| * K = Link Key. |
| * |
| * If the pairing was performed on LE, the 64 LSBs of K correspond to the 64 |
| * LSBs of the IRK that the server sent to the client during the Phase 3 |
| * (Transport Specific Key Distribution) of the pairing procedure (see Volume 3, |
| * Part H, Section 2.1 in [2]), and the 64 MSBs of K correspond to the 64 MSBs |
| * of the LTK shared by the server and client. That is, |
| * K = LTK_64-127 || IRK_0-63 |
| * |
| * @param k 16-byte key. |
| * @param sirk The unencrypted SIRK. |
| * @param out_sirk The encrypted SIRK. |
| * @return int 0 on success, any other value indicates a failure. |
| */ |
| int bt_csis_sef(const uint8_t k[BT_CSIS_CRYPTO_KEY_SIZE], |
| const uint8_t sirk[BT_CSIS_SET_SIRK_SIZE], |
| uint8_t out_sirk[BT_CSIS_SET_SIRK_SIZE]); |
| |
| /** |
| * @brief SIRK decryption function sdf |
| * |
| * The SIRK decryption function sdf is used by the client to decrypt the SIRK |
| * with a key K. The value of K depends on the transport on which the pairing |
| * between the client and the server was performed. |
| * |
| * If the pairing was performed on BR/EDR, K is equal to the Link Key shared by |
| * the server and the client. |
| * K = Link Key. |
| * |
| * If the pairing was performed on LE, the 64 LSBs of K correspond to the 64 |
| * LSBs of the IRK that the server sent to the client during the Phase 3 |
| * (Transport Specific Key Distribution) of the pairing procedure (see Volume 3, |
| * Part H, Section 2.1 in [2]), and the 64 MSBs of K correspond to the 64 MSBs |
| * of the LTK shared by the server and client. That is, |
| * K = LTK_64-127 || IRK_0-63 |
| * |
| * @param k 16-byte key. |
| * @param sirk The encrypted SIRK. |
| * @param out_sirk The decrypted SIRK. |
| * @return int 0 on success, any other value indicates a failure. |
| */ |
| int bt_csis_sdf(const uint8_t k[BT_CSIS_CRYPTO_KEY_SIZE], |
| const uint8_t enc_sirk[BT_CSIS_SET_SIRK_SIZE], |
| uint8_t out_sirk[BT_CSIS_SET_SIRK_SIZE]); |