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

#################### 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.

	  Enabling BT_CAP_ACCEPTOR_SET_MEMBER will take one of the allocated
	  instances.

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

config BT_DEBUG_CSIS
	bool "Coordinated Set Identification Service 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"
	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_CSIS_CLIENT || BT_CSIS
	help
	  Use this option to enable Coordinated Set Identification Service
	  crypto functions debug logs for the Bluetooth Audio functionality.
