blob: a14f65b7164e2d2f82dc199d1f89a7b4bcfde821 [file] [log] [blame]
/*
* 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]);