# Cryptography primitive options for mbed TLS

# Copyright (c) 2016 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

config ZEPHYR_MBEDTLS_MODULE
	bool
config MBEDTLS_PROMPTLESS
	bool
	help
	  Symbol to disable the prompt for MBEDTLS selection.
	  This symbol may be used internally in a Kconfig tree to hide the
	  mbed TLS menu prompt and instead handle the selection of MBEDTLS from
	  dependent sub-configurations and thus prevent stuck symbol behavior.


menuconfig MBEDTLS
	bool "mbed TLS Support" if !MBEDTLS_PROMPTLESS
	help
	  This option enables the mbedTLS cryptography library.

if MBEDTLS

choice MBEDTLS_IMPLEMENTATION
	prompt "Select implementation"
	default MBEDTLS_BUILTIN

config MBEDTLS_BUILTIN
	bool "Use Zephyr in-tree mbedTLS version"
	help
	  Link with mbedTLS sources included with Zephyr distribution.
	  Included mbedTLS version is well integrated with and supported
	  by Zephyr, and the recommended choice for most users.

config MBEDTLS_LIBRARY
	bool "Use external mbedTLS library"
	help
	  Use external, out-of-tree prebuilt mbedTLS library. For advanced
	  users only.

endchoice

config CUSTOM_MBEDTLS_CFG_FILE
	bool "Custom mbed TLS configuration file"
	help
	  Allow user defined input for the MBEDTLS_CFG_FILE setting.
	  You can specify the actual configuration file using the
	  MBEDTLS_CFG_FILE setting.

config MBEDTLS_CFG_FILE
	string "mbed TLS configuration file" if CUSTOM_MBEDTLS_CFG_FILE
	depends on MBEDTLS_BUILTIN
	default "config-tls-generic.h"
	help
	  Use a specific mbedTLS configuration file. The default config file
	  file can be tweaked with Kconfig. The default configuration is
	  suitable to communicate with majority of HTTPS servers on the Internet,
	  but has relatively many features enabled. To optimize resources for
	  special TLS usage, use available Kconfig options, or select an
	  alternative config.

rsource "Kconfig.tls-generic"

config MBEDTLS_SSL_MAX_CONTENT_LEN
	int "Max payload size for TLS protocol message"
	default 1500
	depends on MBEDTLS_BUILTIN
	help
	  The TLS standards mandate max payload size of 16384 bytes. So, for
	  maximum operability and for general-purpose usage, that value must
	  be used. For specific usages, that value can be largely decreased.
	  E.g. for DTLS, payload size is limited by UDP datagram size, and
	  even for HTTPS REST API, the payload can be limited to max size of
	  (REST request, REST response, server certificate(s)).
	  mbedTLS uses this value separate for input and output buffers, so
	  twice this value will be allocated (on mbedTLS own heap, so the
	  value of MBEDTLS_HEAP_SIZE should accommodate that).

module = MBEDTLS
module-str = Log level mbedTLS library debug hook
source "subsys/logging/Kconfig.template.log_config"

config MBEDTLS_DEBUG
	bool "mbed TLS debug activation"
	help
	  Enable debugging activation for mbed TLS configuration. If you use
	  mbedTLS/Zephyr integration (e.g. native TLS sockets), this will
	  activate debug logging.

	  If you use mbedTLS directly instead, you will need to perform
	  additional configuration yourself: call
	  mbedtls_ssl_conf_dbg(&mbedtls.conf, zephyr_mbedtls_debug, NULL);
	  function in your application. Alternatively implement your own debug
	  hook function if zephyr_mbedtls_debug() doesn't suit your needs.

if MBEDTLS_DEBUG

config MBEDTLS_DEBUG_LEVEL
	int
	default 4 if MBEDTLS_LOG_LEVEL_DBG
	default 3 if MBEDTLS_LOG_LEVEL_INF
	default 2 if MBEDTLS_LOG_LEVEL_WRN
	default 1 if MBEDTLS_LOG_LEVEL_ERR
	default 0
	range 0 4
	help
	  Default mbed TLS debug logging level for Zephyr integration code
	  (from ext/lib/crypto/mbedtls/include/mbedtls/debug.h):
	  0 No debug
	  1 Error
	  2 State change
	  3 Information
	  4 Verbose

	  This makes Zephyr call mbedtls_debug_set_threshold() function during
	  mbedTLS initialization, with the configured debug log level.

choice MBEDTLS_DEBUG_EXTRACT_BASENAME
	prompt "Extract basename from filenames"
	default MBEDTLS_DEBUG_EXTRACT_BASENAME_AT_BUILDTIME if "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "zephyr"
	default MBEDTLS_DEBUG_EXTRACT_BASENAME_AT_RUNTIME

config MBEDTLS_DEBUG_EXTRACT_BASENAME_AT_BUILDTIME
	bool "Buildtime"
	help
	  Adds compile options, which should convert full source paths in
	  __FILE__ macro to files' basenames. This will reduce code footprint
	  when debug messages are enabled.

	  This is compiler dependent, so if it does not work then please
	  fallback to MBEDTLS_DEBUG_EXTRACT_BASENAME_AT_RUNTIME instead.

config MBEDTLS_DEBUG_EXTRACT_BASENAME_AT_RUNTIME
	bool "Runtime"
	help
	  Filename passed as argument to debug hook will be stripped from
	  directory, so that only basename part is left and logged.

config MBEDTLS_DEBUG_EXTRACT_BASENAME_DISABLED
	bool "Disabled"
	help
	  Disable basename extraction from filenames in log mesasges. This will
	  result in full paths or paths relative to west root directory
	  appearing in log messages generated by mbedTLS library.

endchoice

config MBEDTLS_DEBUG_STRIP_NEWLINE
	bool "Strip newlines"
	default y
	help
	  Attempt to strip last character from logged string when it is a
	  newline.

endif # MBEDTLS_DEBUG

config MBEDTLS_MEMORY_DEBUG
	bool "mbed TLS memory debug activation"
	depends on MBEDTLS_BUILTIN
	help
	  Enable debugging of buffer allocator memory issues. Automatically
	  prints (to stderr) all (fatal) messages on memory allocation
	  issues. Enables function for 'debug output' of allocated memory.

config MBEDTLS_TEST
	bool "Compile internal self test functions"
	depends on MBEDTLS_BUILTIN
	help
	  Enable self test function for the crypto algorithms

config MBEDTLS_INSTALL_PATH
	string "mbedTLS install path"
	depends on MBEDTLS_LIBRARY
	help
	  This option holds the path where the mbedTLS libraries and headers are
	  installed. Make sure this option is properly set when MBEDTLS_LIBRARY
	  is enabled otherwise the build will fail.

config MBEDTLS_ENABLE_HEAP
	bool "Global heap for mbed TLS"
	help
	  This option enables the mbedtls to use the heap. This setting must
	  be global so that various applications and libraries in Zephyr do not
	  try to do this themselves as there can be only one heap defined
	  in mbedtls. If this is enabled, then the Zephyr will, during the device
	  startup, initialize the heap automatically.

config MBEDTLS_HEAP_SIZE
	int "Heap size for mbed TLS"
	default 10240 if OPENTHREAD_COMMISSIONER || OPENTHREAD_JOINER
	default 512
	depends on MBEDTLS_ENABLE_HEAP
	help
	  The mbedtls routines will use this heap if enabled.
	  See ext/lib/crypto/mbedtls/include/mbedtls/config.h and
	  MBEDTLS_MEMORY_BUFFER_ALLOC_C option for details. That option is not
	  enabled by default.
	  Default value for the heap size is not set as it depends on the
	  application. For streaming communication with arbitrary (HTTPS)
	  servers on the Internet, 32KB + overheads (up to another 20KB) may
	  be needed. For some dedicated and specific usage of mbedtls API, the
	  1000 bytes might be ok.

config MBEDTLS_SHELL
	bool "mbed TLS shell"
	depends on MBEDTLS
	depends on SHELL
	help
	  Enable mbed TLS shell module, which allows to show debug information
	  about mbed TLS library, such as heap usage.

config MBEDTLS_ZEPHYR_ENTROPY
	bool "mbed TLS entropy source based on Zephyr entropy driver"
	depends on MBEDTLS
	help
	  This option enables the entropy source based on Zephyr entropy driver
	  for mbed TLS. The entropy source is registered automatically during
	  system initialization.

config APP_LINK_WITH_MBEDTLS
	bool "Link 'app' with MBEDTLS"
	default y
	help
	  Add MBEDTLS header files to the 'app' include path. It may be
	  disabled if the include paths for MBEDTLS are causing aliasing
	  issues for 'app'.

endif # MBEDTLS
