# Bluetooth Audio - Broadcast Assistant configuration options
#
# Copyright (c) 2020 Bose Corporation
# Copyright (c) 2021 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0
#

if BT_AUDIO

#################### Coordinated Set Identification Service ####################

config BT_CSIS
	bool "Coordinated Set Identification Service Support [EXPERIMENTAL]"
	imply BT_EXT_ADV if BT_PRIVACY
	select EXPERIMENTAL
	help
	  This option enables support for Coordinated Set Identification
	  Service.

if BT_CSIS

config BT_CSIS_TEST_SAMPLE_DATA
	bool "Coordinated Set Identification Service Test Sample Data"
	help
	  Enable the use of the sample data defined by the CSIS spec SIRK.
	  This will use the sample SIRK, prand and LTK.

	  WARNING: This option enables anyone to track and decrypt the SIRK
	  (if encrypted) using public sample data.
	  Should not be used for production builds.

config BT_CSIS_ENC_SIRK_SUPPORT
	bool "Support for encrypted SIRK"
	default y
	select BT_SMP_SC_PAIR_ONLY
	help
	  Enables support encrypting the SIRK.

config BT_CSIS_MAX_INSTANCE_COUNT
	int "Coordinated Set Identification Service max instance count"
	default 1
	range 1 255
	help
	  This option sets the maximum number of instances of Coordinated Set
	  Identification Services. If the service is declared as primary service
	  then only a single instance is possible.

############### DEBUG ###############

config BT_DEBUG_CSIS
	bool "Coordinated Set Identification Service debug"
	depends on BT_AUDIO_DEBUG
	help
	  Use this option to enable Coordinated Set Identification Service debug
	  logs for the Bluetooth Audio functionality.

endif # BT_CSIS

#################### Coordinated Set Identification Client ####################

config BT_CSIS_CLIENT
	bool "Coordinated Set Identification Profile Support [EXPERIMENTAL]"
	select BT_GATT_CLIENT
	select BT_GATT_AUTO_DISCOVER_CCC
	select EXPERIMENTAL
	help
	  This option enables support for Coordinated Set Identification
	  Profile.

if BT_CSIS_CLIENT

config BT_CSIS_CLIENT_TEST_SAMPLE_DATA
	bool "Coordinated Set Identification Service Test Sample Data"
	help
	  Enable the use of the sample data defined by the CSIS spec.
	  This will use the sample SIRK, prand and LTK.

	  WARNING: This option enables the client to use the sample data
	  to locate members and decrypt the SIRK, and thus won't work
	  with set members that are not using the sample data.
	  Should not be used for production builds.

config BT_CSIS_CLIENT_MAX_CSIS_INSTANCES
	int "Coordinated Set Identification Service Count"
	default 1
	range 1 3
	help
	  Sets the number of service instances, which corresponds to the number
	  of different sets the peer device may be in.

config BT_CSIS_CLIENT_ENC_SIRK_SUPPORT
	bool "Support for encrypted SIRK"
	default y
	select BT_SMP_SC_PAIR_ONLY
	help
	  Enables support encrypting the SIRK.

############### DEBUG ###############

config BT_DEBUG_CSIS_CLIENT
	bool "Coordinated Set Identification Profile debug"
	depends on BT_AUDIO_DEBUG
	help
	  Use this option to enable Coordinated Set Identification Profile debug
	  logs for the Bluetooth Audio functionality.

endif # BT_CSIS_CLIENT

config BT_DEBUG_CSIS_CRYPTO
	bool "Coordinated Set Identification Service crypto functions debug"
	depends on BT_AUDIO_DEBUG
	depends on BT_CSIS_CLIENT || BT_CSIS
	help
	  Use this option to enable Coordinated Set Identification Service
	  crypto functions debug logs for the Bluetooth Audio functionality.

endif # BT_AUDIO
