diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/CMakeLists.txt b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/CMakeLists.txt
index ee051c8d..299b9546 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/CMakeLists.txt
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/CMakeLists.txt
@@ -1,6 +1,6 @@
# [wolfSSL Project]/CMakeLists.txt
#
-# Copyright (C) 2014-2024 wolfSSL Inc.
+# Copyright (C) 2014-2025 wolfSSL Inc.
#
# This file is part of wolfSSH.
#
@@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with wolfSSH. If not, see .
#
-# cmake for WOLFSSH Espressif projects
+# cmake for WOLFSSH Espressif projects (echoserver)
#
# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html
@@ -35,6 +35,13 @@ set(WOLFSSL_USER_SETTINGS ON)
# Assume we have a ESP_ENABLE_WOLFSSH section in user_settings.h
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DESP_ENABLE_WOLFSSH")
+# Managed wolfSSL Components prior to 5.7.4 need a manual setting for WOLFSSL_WOLFSSH
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_WOLFSSH")
+
+# Optional:
+# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSH_TERM")
+# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDEBUG_WOLFSSH")
+
# The wolfSSL CMake file should be able to find the source code.
# Otherwise, assign an environment variable or set it here:
#
@@ -54,28 +61,28 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DESP_ENABLE_WOLFSSH")
if(WIN32)
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS")
- message("Detected Windows")
+ message(STATUS "Detected Windows")
endif()
if(CMAKE_HOST_UNIX)
- message("Detected UNIX")
+ message(STATUS "Detected UNIX")
endif()
if(APPLE)
- message("Detected APPLE")
+ message(STATUS "Detected APPLE")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop")
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL")
- message("Detected WSL")
+ message(STATUS "Detected WSL")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32))
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX")
- message("Detected Linux")
+ message(STATUS "Detected Linux")
endif()
if(APPLE)
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE")
- message("Detected Apple")
+ message(STATUS "Detected Apple")
endif()
# End optional WOLFSSL_CMAKE_SYSTEM_NAME
@@ -83,7 +90,7 @@ endif()
set (PROTOCOL_EXAMPLES_DIR $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)
if (EXISTS "${PROTOCOL_EXAMPLES_DIR}")
- message("Found PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}")
+ message(STATUS "Found PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}")
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFOUND_PROTOCOL_EXAMPLES_DIR")
else()
@@ -116,7 +123,7 @@ endif()
set (PROTOCOL_EXAMPLES_DIR $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)
if (EXISTS "${PROTOCOL_EXAMPLES_DIR}")
- message("Found PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}")
+ message(STATUS "Found PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}")
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFOUND_PROTOCOL_EXAMPLES_DIR")
else()
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/README.md b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/README.md
index 770bce63..ef958e34 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/README.md
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/README.md
@@ -11,13 +11,15 @@ To connect:
ssh -p 22222 jack@192.168.1.32
```
+The default password for `jack` is 'fetchapail`.
+
### Prerequisites
It is assumed the [ESP-IDF environment](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/) has been installed.
### Files Included
-- [main.c](./main/main.c) with a simple call to an Espressif library (`ESP_LOGI`) and a call to a wolfSSL library (`esp_ShowExtendedSystemInfo`) .
+- [main.c](./main/main.c) with a simple call to an Espressif library (`ESP_LOGI`) and a call to a wolfSSL library (`esp_ShowExtendedSystemInfo`) .
- See [components/wolfssl/include](./components/wolfssl/include/user_settings.h) directory to edit the wolfSSL `user_settings.h`.
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssh/CMakeLists.txt b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssh/CMakeLists.txt
index 11b8d6a4..4279c3a4 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssh/CMakeLists.txt
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssh/CMakeLists.txt
@@ -1,6 +1,6 @@
# [wolfSSL Project]/components/wolfssh/CMakeLists.txt
#
-# Copyright (C) 2014-2024 wolfSSL Inc.
+# Copyright (C) 2014-2025 wolfSSL Inc.
#
# This file is part of wolfSSH.
#
@@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with wolfSSH. If not, see .
#
-# cmake for WOLFSSH Espressif projects v5.6.6 r1
+# cmake for wolfssh Espressif projects v5.7.6 (template pr)
#
# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html
#
@@ -25,6 +25,70 @@
cmake_minimum_required(VERSION 3.16)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSH_USER_SETTINGS")
+set(VERBOSE_COMPONENT_MESSAGES 1)
+
+# The scope of this CMAKE_C_FLAGS is just this component:
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS")
+
+set(CMAKE_CURRENT_SOURCE_DIR ".")
+
+message(STATUS "CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")
+
+get_filename_component(THIS_DIR "${CMAKE_CURRENT_LIST_DIR}" ABSOLUTE)
+message(STATUS "THIS_DIR = ${THIS_DIR}")
+
+# The root of the project is two directories up from here. (we are typically in [project name]components/mywolfssh)
+get_filename_component(PROJECT_ROOT "${THIS_DIR}" DIRECTORY) # Up one directory from here is "components"
+get_filename_component(PROJECT_ROOT "${PROJECT_ROOT}" DIRECTORY) # up one more directory should be the root of our project
+message(STATUS "PROJECT_ROOT = ${PROJECT_ROOT}")
+
+# in case wolfssl user_settings.h is missing, we'll look for one in the ESP32/lib directory:
+get_filename_component(LIB_USER_SETTINGS "${PROJECT_ROOT}/../lib/user_settings.h" ABSOLUTE)
+message(STATUS "wolfssl user_settings.h lib = ${LIB_USER_SETTINGS}")
+
+get_filename_component(THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH "${PROJECT_ROOT}/components/wolfssl/include" ABSOLUTE)
+message(STATUS "wolfssl user_settings.h path = ${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}")
+
+# Optionally set your source to wolfSSL in your project CMakeLists.txt like this:
+# set(WOLFSSH_ROOT "c:/some/workspace/wolfssh" )
+
+if ( "${WOLFSSH_ROOT}" STREQUAL "")
+ set(WOLFSSH_ROOT "$ENV{WOLFSSH_ROOT}" )
+endif()
+
+# Optional compiler definitions to help with system name detection (typically printed by app diagnostics)
+if( VERBOSE_COMPONENT_MESSAGES )
+ if(WIN32)
+ # Windows-specific configuration here
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS")
+ message(STATUS "Detected Windows")
+ endif()
+ if(CMAKE_HOST_UNIX)
+ message(STATUS "Detected UNIX")
+ endif()
+ if(APPLE)
+ message(STATUS "Detected APPLE")
+ endif()
+ if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop")
+ # Windows-specific configuration here
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL")
+ message(STATUS "Detected WSL")
+ endif()
+ if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32))
+ # Windows-specific configuration here
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX")
+ message(STATUS "Detected Linux")
+ endif()
+ if(APPLE)
+ # Windows-specific configuration here
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE")
+ message(STATUS "Detected Apple")
+ endif()
+endif() # End optional WOLFSSL_CMAKE_SYSTEM_NAME
+
+message(STATUS "CONFIG_TARGET_PLATFORM = ${CONFIG_TARGET_PLATFORM}")
+
+# find the user name to search for possible "wolfssh-username"
# find the user name to search for possible "wolfssh-username"
message(STATUS "USERNAME = $ENV{USERNAME}")
if( "$ENV{USER}" STREQUAL "" ) # the bash user
@@ -44,7 +108,7 @@ message(STATUS "THIS_USER = ${THIS_USER}")
#
# When editing component CMake files, consider the following :
#
-# NO Managed Componenets: Normal stand-alone app, "as cloned" from github.
+# NO Managed Components: Normal stand-alone app, "as cloned" from github.
# There's no notion of staging names (e.g. mywolfssh) regardless of environment settings.
# All of the component source is locall. See settings such s WOLFSSL_ROOT=[your path]
#
@@ -59,12 +123,12 @@ message(STATUS "THIS_USER = ${THIS_USER}")
# A partially managed component may also be manually created, when adding a managed component to
# and existing project. For example:
#
-# idf.py add-dependency "wolfssl/wolfssh^1.4.15-stable"
+# idf.py add-dependency "wolfssl/wolfssh^1.4.18"
#
-# Fully Managaged Componenets. This is the typical example as created from the Component Registry:
+# Fully Managed Components. This is the typical example as created from the Component Registry:
# For example:
#
-# idf.py create-project-from-example "wolfssl/wolfssh^1.4.15-stable:wolfssh_server"
+# idf.py create-project-from-example "wolfssl/wolfssh^1.4.18"
#
# In all cases, keep in mind that components other than wolfssl will depend on the wolfssl component.
#
@@ -108,7 +172,7 @@ endif()
set(COMPONENT_REQUIRES lwip "${WOLFSSL_COMPONENT_NAME}")
# function: IS_WOLFSSH_SOURCE
-# parameter: DIRECTORY_PARAMETER - the directory to test
+# parameter: DIRECTORY_PARAMETER = the directory to test
# output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssh directory, otherwise blank.
function(IS_WOLFSSH_SOURCE DIRECTORY_PARAMETER RESULT)
if (EXISTS "${DIRECTORY_PARAMETER}/wolfssh/ssh.h")
@@ -132,9 +196,29 @@ endfunction()
#
function(FIND_WOLFSSH_DIRECTORY OUTPUT_FOUND_WOLFSSH_DIRECTORY)
message(STATUS "Starting FIND_WOLFSSH_DIRECTORY")
- set(CURRENT_SEARCH_DIR "$ENV{WOLFSSH_ROOT}")
- if( "${CURRENT_SEARCH_DIR}" STREQUAL "" )
- message(STATUS "The WOLFSSH_ROOT environment variable is not set. Searching...")
+
+ message(STATUS "OUTPUT_FOUND_WOLFSSH_DIRECTORY = ${${OUTPUT_FOUND_WOLFSSH_DIRECTORY}}")
+ IS_WOLFSSH_SOURCE("${${OUTPUT_FOUND_WOLFSSH_DIRECTORY}}" FOUND_WOLFSSH)
+ if( FOUND_WOLFSSH )
+ set(${OUTPUT_FOUND_WOLFSSH_DIRECTORY} ${${OUTPUT_FOUND_WOLFSSH_DIRECTORY}} PARENT_SCOPE)
+ return()
+ endif()
+ message(STATUS "")
+
+ if ( "${${OUTPUT_FOUND_WOLFSSH_DIRECTORY}}" STREQUAL "" )
+ set(CURRENT_SEARCH_DIR "$ENV{WOLFSSH_ROOT}")
+ if( "${CURRENT_SEARCH_DIR}" STREQUAL "" )
+ message(STATUS "The WOLFSSH_ROOT environment variable is not set. Searching...")
+ else()
+ get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSH_ROOT}" ABSOLUTE)
+ IS_WOLFSSH_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSH)
+ if( FOUND_WOLFSSH )
+ message(STATUS "Found WOLFSSH_ROOT via Environment Variable:")
+ else()
+ message(FATAL_ERROR "WOLFSSH_ROOT Environment Variable defined, but path not found:")
+ message(STATUS "$ENV{WOLFSSH_ROOT}")
+ endif()
+ endif()
else()
# There's a non-blank WOLFSSH_ROOT environment variable. Is it a valid wolfssh directory?
get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSH_ROOT}" ABSOLUTE)
@@ -143,11 +227,11 @@ function(FIND_WOLFSSH_DIRECTORY OUTPUT_FOUND_WOLFSSH_DIRECTORY)
message(STATUS "Found WOLFSSH_ROOT via Environment Variable:")
else()
message(FATAL_ERROR "WOLFSSH_ROOT Environment Variable defined, but path not found: $ENV{WOLFSSH_ROOT}")
- message(STATUS "Exit CMake")
+ #message(STATUS "Exit CMake")
endif()
endif()
- # we'll start in the THIS_CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/WOLFSSH
+ # we'll start in the THIS_CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssh
message(STATUS "THIS_CMAKE_CURRENT_SOURCE_DIR = ${THIS_CMAKE_CURRENT_SOURCE_DIR}")
get_filename_component(CURRENT_SEARCH_DIR "${THIS_CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
@@ -156,7 +240,7 @@ function(FIND_WOLFSSH_DIRECTORY OUTPUT_FOUND_WOLFSSH_DIRECTORY)
# loop through all the parents, looking for wolfssh
while(NOT CURRENT_SEARCH_DIR STREQUAL "/" AND NOT CURRENT_SEARCH_DIR STREQUAL "" )
string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH)
- # wolfssh may simply be in a parent directory, such as for local examples in WOLFSSH repo
+ # wolfssh may simply be in a parent directory, such as for local examples in wolfssh repo
IS_WOLFSSH_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSH)
if( FOUND_WOLFSSH )
message(STATUS "Found wolfssh in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
@@ -178,7 +262,7 @@ function(FIND_WOLFSSH_DIRECTORY OUTPUT_FOUND_WOLFSSH_DIRECTORY)
endif()
endif()
- # Next check for no user suffix "WOLFSSH" subdirectory as we recurse up the directory tree
+ # Next check for no user suffix "wolfssh" subdirectory as we recurse up the directory tree
set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssh)
# if(EXISTS ${CURRENT_SEARCH_DIR} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR} AND EXISTS "${CURRENT_SEARCH_DIR}/wolfcrypt/src")
IS_WOLFSSH_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSH )
@@ -206,18 +290,18 @@ endfunction()
# The component name is the directory name. "No feature to change this".
# See https://github.com/espressif/esp-idf/issues/8978#issuecomment-1129892685
-# set the root of WOLFSSH in top-level project CMakelists.txt:
+# set the root of wolfssh in top-level project CMakelists.txt:
# set(WOLFSSH_ROOT "C:/some path/with/spaces")
-# set(WOLFSSH_ROOT "c:/workspace/WOLFSSH-[username]")
+# set(WOLFSSH_ROOT "c:/workspace/wolfssh-[username]")
# set(WOLFSSH_ROOT "/mnt/c/some path/with/spaces")
# or use this logic to assign value from Environment Variable WOLFSSH_ROOT,
# or assume this is an example 7 subdirectories below:
-# We are typically in [root]/IDE/Espressif/ESP-IDF/examples/WOLFSSH_test/components/WOLFSSH
-# The root of WOLFSSH is 7 directories up from here:
+# We are typically in [root]/IDE/Espressif/ESP-IDF/examples/wolfssh_test/components/wolfssh
+# The root of wolfssh is 7 directories up from here:
if(CMAKE_BUILD_EARLY_EXPANSION)
- message(STATUS "WOLFSSH component CMAKE_BUILD_EARLY_EXPANSION:")
+ message(STATUS "wolfssh component CMAKE_BUILD_EARLY_EXPANSION:")
idf_component_register(
REQUIRES "${COMPONENT_REQUIRES}"
PRIV_REQUIRES
@@ -233,23 +317,117 @@ else()
message(STATUS "************************************************************************************************")
FIND_WOLFSSH_DIRECTORY(WOLFSSH_ROOT)
- set(WOLFSSH_ROOT "${WOLFSSH_ROOT}" CACHE STRING "WOLFSSH_ROOT")
- if(WOLFSSH_ROOT)
- message(STATUS "Found wolfssh directory at: ${WOLFSSH_ROOT}")
- else()
- message(STATUS "wolfssh directory not found.")
- # Abort. We need wolfmqtt _somewhere_.
- message(FATAL_ERROR "Could not find wolfssh in ${WOLFSSH_ROOT}.\n"
- "Try setting WOLFSSH_ROOT environment variable or git clone.")
+ # Check to see if we're already in wolfssh, and only if WOLFSSH_ROOT not specified
+ if ("${WOLFSSH_ROOT}" STREQUAL "")
+ # wolfssh examples are 7 directories deep from wolfssh repo root
+ # 1 2 3 4 5 6 7
+ set(THIS_RELATIVE_PATH "../../../../../../..")
+ get_filename_component(THIS_SEARCH_PATH "${THIS_RELATIVE_PATH}" ABSOLUTE)
+ message(STATUS "Searching in path = ${THIS_SEARCH_PATH}")
+
+ if (EXISTS "${THIS_SEARCH_PATH}/wolfcrypt/src")
+ # we're already in wolfssh examples!
+ get_filename_component(WOLFSSH_ROOT "${THIS_SEARCH_PATH}" ABSOLUTE)
+ message(STATUS "Using wolfssh example with root ${WOLFSSH_ROOT}")
+ else()
+ # We're in some other repo such as wolfssh, so we'll search for an
+ # adjacent-level directory for wolfssh. (8 directories up, then down one)
+ #
+ # For example wolfssh examples:
+ # C:\workspace\wolfssh-gojimmypi\IDE\Espressif\ESP-IDF\examples\wolfssh_benchmark\components\wolfssh
+ #
+ # For example wolfSSH examples:
+ # C:\workspace\wolfssh-gojimmypi\ide\Espressif\ESP-IDF\examples\wolfssh_benchmark\components\WOLFSSH
+ #
+ # 1 2 3 4 5 6 7 8
+ set(THIS_RELATIVE_PATH "../../../../../../../..")
+ get_filename_component(THIS_SEARCH_PATH "${THIS_RELATIVE_PATH}" ABSOLUTE)
+ message(STATUS "Searching next in path = ${THIS_SEARCH_PATH}")
+ endif()
endif()
+ # search other possible locations
+ if ("${WOLFSSH_ROOT}" STREQUAL "")
+ # there's not a hard-coded WOLFSSH_ROOT value above, so let's see if we can find it.
+ if( "$ENV{WOLFSSH_ROOT}" STREQUAL "" )
+ message(STATUS "Environment Variable WOLFSSH_ROOT not set. Will search common locations.")
+
+ message(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
+ get_filename_component(THIS_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
+ message(STATUS "THIS_DIR = ${THIS_DIR}")
+
+ # find the user name to search for possible "wolfssh-username"
+ message(STATUS "USERNAME = $ENV{USERNAME}")
+ if( "$ENV{USER}" STREQUAL "" ) # the bash user
+ if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user
+ message(STATUS "could not find USER or USERNAME")
+ else()
+ # the bash user is not blank, so we'll use it.
+ set(THIS_USER "$ENV{USERNAME}")
+ endif()
+ else()
+ # the bash user is not blank, so we'll use it.
+ set(THIS_USER "$ENV{USER}")
+ endif()
+ message(STATUS "THIS_USER = ${THIS_USER}")
+
+ # This same makefile is used for both the wolfssh component, and other
+ # components that may depend on wolfssh, such as wolfssh. Therefore
+ # we need to determine if this makefile is in the wolfssh repo, or
+ # some other repo.
+
+ if( "{THIS_USER}" STREQUAL "" )
+ # This is highly unusual to not find a user name.
+ # In this case, we'll just search for a "wolfssh" directory:
+ message(STATUS "No username found!")
+ get_filename_component(WOLFSSH_ROOT "${THIS_RELATIVE_PATH}/wolfssh" ABSOLUTE)
+ else()
+ # We found an environment USER name!
+ # The first place to look for wolfssh will be in a user-clone called "wolfssh-[username]"
+ message(STATUS "Using [THIS_USER = ${THIS_USER}] to see if there's a [relative path]/wolfssh-${THIS_USER} directory.")
+ get_filename_component(WOLFSSH_ROOT "${THIS_RELATIVE_PATH}/wolfssh-${THIS_USER}" ABSOLUTE)
+
+ if( EXISTS "${WOLFSSH_ROOT}" )
+ message(STATUS "Found wolfssh in user-suffix ${WOLFSSH_ROOT}")
+ else()
+ # If there's not a user-clone called "wolfssh-[username]",
+ # perhaps there's simply a git clone called "wolfssh"?
+ message(STATUS "Did not find wolfssh-${THIS_USER}; continuing search...")
+ get_filename_component(WOLFSSH_ROOT "${THIS_RELATIVE_PATH}/wolfssh" ABSOLUTE)
+
+ if( EXISTS "${WOLFSSH_ROOT}" )
+ message(STATUS "Found wolfssh in standard ${WOLFSSH_ROOT}")
+ else()
+ # Things are looking pretty bleak. We'll likely not be able to compile.
+ message(STATUS "Did not find wolfssh in ${WOLFSSH_ROOT}")
+ endif()
+ endif()
+ endif()
+
+ else()
+ # there's an environment variable, so use it.
+ set(WOLFSSH_ROOT "$ENV{WOLFSSH_ROOT}")
+
+ if( EXISTS "${WOLFSSH_ROOT}" )
+ get_filename_component(WOLFSSH_ROOT "$ENV{WOLFSSH_ROOT}" ABSOLUTE)
+ message(STATUS "Found WOLFSSH_ROOT via Environment Variable:")
+ else()
+ message(FATAL_ERROR "WOLFSSH_ROOT Environment Variable defined, but path not found:")
+ message(STATUS "$ENV{WOLFSSH_ROOT}")
+ endif()
+ endif()
+ # end of search for WOLFSSH component root
+ else()
+ # There's already a value assigned; we won't search for anything else.
+ message(STATUS "Found user-specified WOLFSSH_ROOT value.")
+ endif() # WOLFSSH_ROOT user defined
# After all the logic above, does our WOLFSSH_ROOT actually exist?
if( EXISTS "${WOLFSSH_ROOT}" )
message(STATUS "WOLFSSH_ROOT = ${WOLFSSH_ROOT}")
else()
- # Abort. We need WOLFSSH _somewhere_.
- message(FATAL_ERROR "Could not find WOLFSSH in ${WOLFSSH_ROOT}. Try setting environment variable or git clone.")
+ # Abort. We need wolfssh _somewhere_.
+ message(FATAL_ERROR "Could not find wolfssh in ${WOLFSSH_ROOT}. Try setting environment variable or git clone.")
endif()
@@ -270,86 +448,97 @@ else()
message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}")
#
- # Check to see if there's both a local copy and EDP-IDF copy of the WOLFSSH and/or wolfssh components.
+ # Check to see if there's both a local copy and EDP-IDF copy of the wolfssh and/or wolfssh components.
#
- if( EXISTS "${WOLFSSH_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/WOLFSSH/" )
+ if( EXISTS "${WOLFSSH_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssh/" )
#
- # WOLFSSH found in both ESP-IDF and local project - needs to be resolved by user
+ # wolfssh found in both ESP-IDF and local project - needs to be resolved by user
#
message(STATUS "")
message(STATUS "**************************************************************************************")
message(STATUS "")
- message(STATUS "Error: Found components/WOLFSSH in both local project and IDF_PATH")
+ message(STATUS "Error: Found components/wolfssh in both local project and IDF_PATH")
message(STATUS "")
message(STATUS "To proceed: ")
message(STATUS "")
message(STATUS "Remove either the local project component: ${WOLFSSH_PROJECT_DIR} ")
- message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/WOLFSSH/ ")
+ message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssh/ ")
message(STATUS "")
- message(FATAL_ERROR "Please use WOLFSSH in either local project or Espressif components, but not both.")
+ message(FATAL_ERROR "Please use wolfssh in either local project or Espressif components, but not both.")
message(STATUS "")
message(STATUS "**************************************************************************************")
message(STATUS "")
+ message(STATUS "Please use wolfSSL in either local project or Espressif components, but not both.")
+
# Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSH_MULTI_INSTALL_WARNING")
else()
- if( EXISTS "$ENV{IDF_PATH}/components/WOLFSSH/" )
+ if( EXISTS "$ENV{IDF_PATH}/components/wolfssh/" )
#
- # WOLFSSH found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup.
+ # wolfssh found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup.
#
message(STATUS "")
- message(STATUS "Using components/WOLFSSH in IDF_PATH = $ENV{IDF_PATH}")
+ message(STATUS "Using components/wolfssh in IDF_PATH = $ENV{IDF_PATH}")
message(STATUS "")
else()
#
- # WOLFSSH is not an ESP-IDF component.
- # We need to now determine if it is local and if so if it is part of the WOLFSSH repo,
- # or if WOLFSSH is simply installed as a local component.
+ # wolfssh is not an ESP-IDF component.
+ # We need to now determine if it is local and if so if it is part of the wolfssh repo,
+ # or if wolfssh is simply installed as a local component.
#
-
+ message(STATUS "Looking at WOLFSSH_PROJECT_DIR = '${WOLFSSH_PROJECT_DIR}'")
if( EXISTS "${WOLFSSH_PROJECT_DIR}" )
#
- # WOLFSSH found in local project.
+ # wolfssh found in local project.
#
- if( EXISTS "${WOLFSSH_PROJECT_DIR}/wolfcrypt/" )
+ if( EXISTS "${WOLFSSH_PROJECT_DIR}/wolfssh/" )
message(STATUS "")
- message(STATUS "Using installed project ./components/WOLFSSH in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
+ message(STATUS "Using installed project ./components/wolfssh in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
message(STATUS "")
#
- # Note we already checked above and confirmed there's not another WOLFSSH installed in the ESP-IDF components.
+ # Note we already checked above and confirmed there's not another wolfssh installed in the ESP-IDF components.
#
# We won't do anything else here, as it will be assumed the original install completed successfully.
#
- else() # full WOLFSSH not installed in local project
+ else() # full wolfssh not installed in local project
#
- # This is the developer repo mode. WOLFSSH will be assumed to be not installed to ESP-IDF nor local project
- # In this configuration, we are likely running a WOLFSSH example found directly in the repo.
+ # This is the developer repo mode. wolfssh will be assumed to be not installed to ESP-IDF nor local project
+ # In this configuration, we are likely running a wolfssh example found directly in the repo.
#
message(STATUS "")
- message(STATUS "Using developer repo ./components/WOLFSSH in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
+ message(STATUS "Using developer repo ./components/wolfssh in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
message(STATUS "")
message(STATUS "************************************************************************************************")
- # When in developer mode, we are typically running WOLFSSH examples such as benchmark or test directories.
- # However, the as-cloned or distributed WOLFSSH does not have the ./include/ directory, so we'll add it as needed.
+ # When in developer mode, we are typically running wolfssh examples such as benchmark or test directories.
+ # However, the as-cloned or distributed wolfssh does not have the ./include/ directory, so we'll add it as needed.
#
# first check if there's a [root]/include/user_settings.h
if( EXISTS "${WOLFSSH_ROOT}/include/user_settings.h" )
- message(FATAL_ERROR "Found stray WOLFSSH user_settings.h in "
+ message(FATAL_ERROR "Found stray wolfssh user_settings.h in "
"${WOLFSSH_ROOT}/include/user_settings.h "
- " (please move it to ${WOLFSSH_PROJECT_DIR}/include/user_settings.h )")
+ " (please move it to ${WOLFSSH_PROJECT_DIR}/components/wolfssl/include/user_settings.h )")
else()
# we won't overwrite an existing user settings file, just note that we already have one:
- if( EXISTS "${WOLFSSH_PROJECT_DIR}/include/user_settings.h" )
- message(STATUS "Using existing WOLFSSH user_settings.h in "
- "${WOLFSSH_PROJECT_DIR}/include/user_settings.h")
+ if( EXISTS "${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}/user_settings.h" )
+ message(STATUS "Using existing wolfssh user_settings.h in "
+ "${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}")
else()
- message(STATUS "Installing WOLFSSH user_settings.h to "
- "${WOLFSSH_PROJECT_DIR}/include/user_settings.h")
- # file(COPY "${WOLFSSH_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h"
- # DESTINATION "${CMAKE_HOME_DIRECTORY}/WOLFSSH/include/")
+ if(EXISTS "${LIB_USER_SETTINGS}" )
+ message(STATUS "Installing wolfssh user_settings.h to "
+ "${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}")
+ file(COPY "${LIB_USER_SETTINGS}"
+ DESTINATION "${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}")
+ if( EXISTS "${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}/user_settings.h" )
+ message(STATUS "Confirmed wolfssl user_settings.h in ${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}")
+ else()
+ message(ERROR "ERROR: Failed to copy wolfssl user_settings.h from ${LIB_USER_SETTINGS} to ${LIB_USER_SETTINGS}")
+ endif()
+ else()
+ message(ERROR "wolfssl user_settings.h not in project, and not found in ${LIB_USER_SETTINGS}")
+ endif()
endif()
endif() # user_settings.h
@@ -358,19 +547,19 @@ else()
endif()
else()
- # we did not find a ./components/WOLFSSH/include/ directory from this pass of cmake.
+ # we did not find a ./components/wolfssh/include/ directory from this pass of cmake.
if($WOLFSSH_FOUND_IDF)
message(STATUS "")
- message(STATUS "WARNING: WOLFSSH not found.")
+ message(STATUS "WARNING: wolfssh not found.")
message(STATUS "")
else()
# probably needs to be re-parsed by Espressif
- message(STATUS "WOLFSSH found IDF. Project Source:${PROJECT_SOURCE_DIR}")
+ message(STATUS "wolfssh found IDF. Project Source:${PROJECT_SOURCE_DIR}")
endif() # else we have not found ESP-IDF yet
- endif() # else not a local WOLFSSH component
+ endif() # else not a local wolfssh component
endif() #else not an ESP-IDF component
- endif() # else not local copy and EDP-IDF WOLFSSH
+ endif() # else not local copy and EDP-IDF wolfssh
# RTOS_IDF_PATH is typically:
@@ -459,17 +648,17 @@ else()
message(STATUS "")
endif()
- # target_sources(WOLFSSH PRIVATE "\"${WOLFSSH_ROOT}/WOLFSSH/\"" "\"${WOLFSSH_ROOT}/WOLFSSH/wolfcrypt\"")
+ # target_sources(wolfssh PRIVATE "\"${WOLFSSH_ROOT}/wolfssh/\"" "\"${WOLFSSH_ROOT}/wolfssh/wolfcrypt\"")
endif() # CMAKE_BUILD_EARLY_EXPANSION
-# check to see if there's both a local copy and EDP-IDF copy of the WOLFSSH components
-if( EXISTS "${WOLFSSH_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/WOLFSSH/" )
+# check to see if there's both a local copy and EDP-IDF copy of the wolfssh components
+if( EXISTS "${WOLFSSH_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssh/" )
message(STATUS "")
message(STATUS "")
message(STATUS "********************************************************************")
- message(STATUS "WARNING: Found components/WOLFSSH in both local project and IDF_PATH")
+ message(STATUS "WARNING: Found components/wolfssh in both local project and IDF_PATH")
message(STATUS "********************************************************************")
message(STATUS "")
endif()
@@ -539,6 +728,6 @@ if(NOT CMAKE_BUILD_EARLY_EXPANSION)
LIBWOLFSSH_SAVE_INFO(LIBWOLFSSH_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}")
message(STATUS "************************************************************************************************")
- message(STATUS "WOLFSSH component config complete!")
+ message(STATUS "wolfssh component config complete!")
message(STATUS "************************************************************************************************")
endif()
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssh/README.md b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssh/README.md
new file mode 100644
index 00000000..5f69e1b8
--- /dev/null
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssh/README.md
@@ -0,0 +1,3 @@
+# wolfSSH Component
+
+All related settings are in the wolfSSL component.
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/CMakeLists.txt b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/CMakeLists.txt
index 6ee31d2b..4a0ab068 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/CMakeLists.txt
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/CMakeLists.txt
@@ -1,5 +1,5 @@
#
-# Copyright (C) 2014-2024 wolfSSL Inc.
+# Copyright (C) 2014-2025 wolfSSL Inc.
#
# This file is part of wolfSSH.
#
@@ -18,30 +18,195 @@
#
# cmake for wolfssl Espressif projects
#
-# Version 5.7.0 template update + THIS_IDF_PATH
+# Version 5.8.0 Espressif ESP-IDF + PlatformIO integration (2)
#
# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html
#
-
+message(STATUS "Begin wolfssl ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT}")
cmake_minimum_required(VERSION 3.16)
-set(VERBOSE_COMPONENT_MESSAGES 1)
-
# The scope of this CMAKE_C_FLAGS is just this component:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWOLFSSL_USER_SETTINGS")
set(CMAKE_CURRENT_SOURCE_DIR ".")
-# set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component
# Optionally set your source to wolfSSL in your project CMakeLists.txt like this:
-# set(WOLFSSL_ROOT "c:/test/my_wolfssl" )
+# set(WOLFSSL_ROOT "c:/workspace/my_wolfssl" )
if ( "${WOLFSSL_ROOT}" STREQUAL "")
set(WOLFSSL_ROOT "$ENV{WOLFSSL_ROOT}" )
endif()
+set(VERBOSE_COMPONENT_MESSAGES 1)
+
+# Optional requires include:
+# set(THIS_ESP_TLS "esp-tls")
+set(THIS_ESP_TLS "")
+
+# LIBWOLFSSL_CMAKE_OUTPUT can be printed at runtime
+set(LIBWOLFSSL_CMAKE_OUTPUT "")
+
+
+if(CMAKE_BUILD_EARLY_EXPANSION)
+ message(STATUS "Skipping libwolfssl_output.h update during CMAKE_BUILD_EARLY_EXPANSION")
+else()
+ # Initialize a new libwolfssl_output.h in the cmake build directory.
+ if( EXISTS "${CMAKE_BINARY_DIR}/libwolfssl_output.h")
+ # The next WRITE replaces a file.
+ # This is here to remove any ambiguity on file removal & generation.
+ file(REMOVE "${CMAKE_BINARY_DIR}/libwolfssl_output.h")
+ endif()
+
+ file(WRITE "${CMAKE_BINARY_DIR}/libwolfssl_output.h"
+ "/* libwolfssl_output.h generated by wolfssl component */\n"
+ "#ifndef _LIBWOLFSSL_OUTPUT_H_\n"
+ "\n"
+ "#define _LIBWOLFSSL_OUTPUT_H_\n\n")
+endif()
+
+# Append messages with:
+# LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_CMAKE_OUTPUT "${LIBWOLFSSL_CMAKE_OUTPUT}\n"message" "0")
+# See function: APPEND_LIBWOLFSSL_CMAKE_OUTPUT
+
+# function: IS_ESP_IDF_COMPONENT
+# output: RESULT = 1 (true) if this component is located in the ESP-IDF components
+# otherwise 0 (false)
+function( IS_ESP_IDF_COMPONENT
+ RESULT)
+ # NOTE: Component location is based on the location of the CMakeList.txt
+ # and *not* the location of the wolfSSL source code. (which may be anywhere)
+
+ # Normalize the paths to remove any trailing slashes
+ get_filename_component(NORMALIZED_IDF_PATH "${IDF_PATH}" REALPATH)
+ get_filename_component(NORMALIZED_TEST_PATH "${COMPONENT_DIR}" REALPATH)
+
+ # Check if the test path starts with the IDF_PATH
+ string(FIND "${NORMALIZED_TEST_PATH}" "${NORMALIZED_IDF_PATH}" pos)
+
+ if(${pos} EQUAL 0)
+ message(STATUS "${COMPONENT_DIR} is within IDF_PATH.")
+ set(${RESULT} 1 PARENT_SCOPE)
+ else()
+ message(STATUS "${COMPONENT_DIR} is not within IDF_PATH.")
+ set(${RESULT} 0 PARENT_SCOPE)
+ endif()
+endfunction()
+
+#
+# LIBWOLFSSL_SAVE_INFO(VAR_OUTPUT THIS_VAR VAR_RESULT)
+#
+# Save the THIS_VAR as a string in a macro called VAR_OUTPUT
+#
+# VAR_OUTPUT: the name of the macro to define
+# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process()
+# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful.
+#
+function ( LIBWOLFSSL_SAVE_INFO VAR_OUTPUT THIS_VAR VAR_RESULT )
+ # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true.
+ string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE)
+
+ # if we had a successful operation, save the THIS_VAR in VAR_OUTPUT
+ if(${IS_VALID_VALUE})
+
+ if(0)
+ # Optional debug
+ message(STATUS "Looking for LF in ${THIS_VAR}")
+ endif()
+
+ # Check if the text to print in THIS_VAR is multi-line
+ string(REPLACE "\n" ";" LINES "${THIS_VAR}")
+ list(LENGTH LINES LINE_COUNT)
+
+ # Save var to "libwolfssl_output.h" header if multi-line, otherwise a simple compile def
+ if(LINE_COUNT GREATER 1)
+ message(STATUS "Setting HAVE_LIBWOLFSSL_OUTPUT_HEADER=1 for ${VAR_OUTPUT}")
+ add_compile_definitions(HAVE_LIBWOLFSSL_OUTPUT_HEADER=1)
+ file(APPEND "${CMAKE_BINARY_DIR}/libwolfssl_output.h" "#undef ${VAR_OUTPUT}\n")
+ file(APPEND "${CMAKE_BINARY_DIR}/libwolfssl_output.h" "#define ${VAR_OUTPUT} \\\n")
+
+ # Split into lines
+ string(REPLACE "\n" ";" LINES "${THIS_VAR}")
+ foreach(LINE IN LISTS LINES)
+ file(APPEND "${CMAKE_BINARY_DIR}/libwolfssl_output.h" "\"${LINE}\\n\" \\\n")
+ endforeach()
+
+ # Final empty line to close the macro
+ file(APPEND "${CMAKE_BINARY_DIR}/libwolfssl_output.h" "\n")
+
+ message(STATUS "COMPONENT_LIB=${COMPONENT_LIB}")
+ target_include_directories(${COMPONENT_LIB} PRIVATE "${CMAKE_BINARY_DIR}")
+ else()
+ message(STATUS "No HAS_LIBWOLFSSL_OUTPUT_HEADER")
+ # We should not have any, but just to be sure:
+ # Strip newline chars in THIS_VAR parameter and save in VAR_VALUE
+ string(REPLACE "\n" "" VAR_VALUE "${THIS_VAR}")
+
+ # we'll could percolate the value to the parent for possible later use
+ # set(${VAR_OUTPUT} ${VAR_VALUE} PARENT_SCOPE)
+
+ # but we're only using it here in this function
+ set(${VAR_OUTPUT} ${VAR_VALUE})
+
+ # we'll print what we found to the console
+ message(STATUS "Found ${VAR_OUTPUT}=${VAR_VALUE}")
+
+ # the interesting part is defining the VAR_OUTPUT name a value to use in the app
+ add_compile_definitions(${VAR_OUTPUT}=\"${VAR_VALUE}\")
+
+ endif()
+ else()
+ # if we get here, check the execute_process command and parameters.
+ message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT")
+ set(${VAR_OUTPUT} "Unknown")
+ endif()
+
+
+endfunction() # LIBWOLFSSL_SAVE_INFO
+
+#
+# APPEND_LIBWOLFSSL_CMAKE_OUTPUT(THIS_MESSAGE OUTPUT_VALUE)
+#
+# Append the text in THIS_MESSAGE to LIBWOLFSSL_CMAKE_OUTPUT.
+# String is available at runtime in app
+#
+
+function( APPEND_LIBWOLFSSL_CMAKE_OUTPUT
+ THIS_MESSAGE )
+ # Normally, we'd simply print a message:
+ message(STATUS "${THIS_MESSAGE}")
+
+ # But here we'll pass the entire LIBWOLFSSL_CMAKE_OUTPUT as a string definition to the app
+ set(LIBWOLFSSL_CMAKE_OUTPUT "${LIBWOLFSSL_CMAKE_OUTPUT}\n${THIS_MESSAGE}" PARENT_SCOPE)
+
+ # We don't call LIBWOLFSSL_SAVE_INFO here as it would add duplicate definitions
+ # See single instance at the end of this file.
+endfunction()
+
+# Determine if this cmake file is located in the ESP-IDF component directory or not,
+# and if so, if it is being ignored (allowing the use of a local project one, instead).
+IS_ESP_IDF_COMPONENT( IS_WOLSSL_ESP_IDF_COMPONENT )
+if( IS_WOLSSL_ESP_IDF_COMPONENT )
+ message(STATUS "This wolfSSL is a component in ESP-IDF.")
+ if ( CONFIG_IGNORE_ESP_IDF_WOLFSSL_COMPONENT )
+ idf_component_register()
+ message(STATUS "Warning: wolfSSL component in ESP-IDF is being ignored.")
+ return()
+ endif()
+endif()
+
+
+if( "${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT}" STREQUAL "" )
+ # nothing to do
+else()
+ # Only forward slashes, or double backslashes are supported.
+ # By the time we get here the sdkconfig file has a value for wolfSSL source code root.
+ string(REPLACE "\\" "/" CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT})
+ message(STATUS "Cleaned wolfssl path: ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT}")
+endif()
+
if( "$ENV{IDF_PATH}" STREQUAL "" )
- message(FATAL_ERROR "IDF_PATH Environment variable not set!")
+ message(FATAL_ERROR "IDF_PATH Environment variable not set!")
else()
string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}")
endif()
@@ -51,28 +216,28 @@ if(VERBOSE_COMPONENT_MESSAGES)
if(WIN32)
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS")
- message("Detected Windows")
+ message(STATUS "Detected Windows")
endif()
if(CMAKE_HOST_UNIX)
- message("Detected UNIX")
+ message(STATUS "Detected UNIX")
endif()
if(APPLE)
- message("Detected APPLE")
+ message(STATUS "Detected APPLE")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop")
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL")
- message("Detected WSL")
+ message(STATUS "Detected WSL")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32))
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX")
- message("Detected Linux")
+ message(STATUS "Detected Linux")
endif()
if(APPLE)
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE")
- message("Detected Apple")
+ message(STATUS "Detected Apple")
endif()
endif() # End optional WOLFSSL_CMAKE_SYSTEM_NAME
@@ -105,10 +270,11 @@ if( ("${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_benchmark") OR ("${CMAKE_PROJECT_
message(STATUS "Not including lwip for ${CMAKE_PROJECT_NAME}")
else()
# benchmark and test do not need wifi, everything else probably does:
- set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component
+ set(COMPONENT_REQUIRES lwip "${THIS_ESP_TLS}") # we typically don't need lwip directly in wolfssl component
endif()
-# find the user name to search for possible "wolfssl-username"
+# Find the user name to search for possible "wolfssl-username"
+# Reminder: Windows is %USERNAME%, Linux is $USER
message(STATUS "USERNAME = $ENV{USERNAME}")
if( "$ENV{USER}" STREQUAL "" ) # the bash user
if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user
@@ -123,6 +289,32 @@ else()
endif()
message(STATUS "THIS_USER = ${THIS_USER}")
+if( "$ENV{IDF_PATH}" STREQUAL "" )
+ message(FATAL_ERROR "IDF_PATH Environment variable not set!")
+else()
+ string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}")
+endif()
+
+# ENVIRONMENT_VAR_TO_MACRO
+# Check environment variable name EVARPARAM as [name]
+# If defined, and has a value of EVARVALUE as [value],
+# then assign a compiler definition "-D[name]=[value]"
+function( ENVIRONMENT_VAR_TO_MACRO
+ EVARPARAM # Environment variable parameter name
+ EVARVALUE) # Environment variable value
+ # If the EVARPARAM environment variable name is set to EVARVALUE,
+ # set the compiler flag definition to enable CSV output.
+ if ( "$ENV{${EVARPARAM}}" STREQUAL "${EVARVALUE}")
+ message(STATUS "Appending compile definition: -D${EVARPARAM}=${EVARVALUE}")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D${EVARPARAM}=${EVARVALUE}")
+ else()
+ if(DEFINED ENV{${EVARPARAM}})
+ message(STATUS "Environment variable ${EVARPARAM} detected but set to $ENV{${EVARPARAM}}, not appending compile definition.")
+ else()
+ message(STATUS "Environment variable ${EVARPARAM} not detected, not appending compile definition.")
+ endif()
+ endif()
+endfunction()
# COMPONENT_NAME = wolfssl
# The component name is the directory name. "No feature to change this".
@@ -141,7 +333,9 @@ message(STATUS "THIS_USER = ${THIS_USER}")
# function: IS_WOLFSSL_SOURCE
# parameter: DIRECTORY_PARAMETER - the directory to test
# output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssl directory, otherwise blank.
-function(IS_WOLFSSL_SOURCE DIRECTORY_PARAMETER RESULT)
+function( IS_WOLFSSL_SOURCE
+ DIRECTORY_PARAMETER
+ RESULT )
if (EXISTS "${DIRECTORY_PARAMETER}/wolfcrypt/src")
set(${RESULT} "${DIRECTORY_PARAMETER}" PARENT_SCOPE)
else()
@@ -156,30 +350,61 @@ endfunction()
# Example usage:
# FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
# *********************************************************************************************
-function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY)
+function( FIND_WOLFSSL_DIRECTORY
+ OUTPUT_FOUND_WOLFSSL_DIRECTORY)
message(STATUS "Starting FIND_WOLFSSL_DIRECTORY: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}")
if ( "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}" STREQUAL "" )
+ # The parameter is empty, so we certainly need to search.
+ # First, see if there's an environment variable. This takes highest priority (unless already found as hard-coded, above)
set(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}")
if( "${CURRENT_SEARCH_DIR}" STREQUAL "" )
message(STATUS "The WOLFSSL_ROOT environment variable is not set. Searching...")
- else()
- get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE)
- IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL)
- if( FOUND_WOLFSSL )
- message(STATUS "Found WOLFSSL_ROOT via Environment Variable:")
+ # Next, if not found, see if wolfSSL was selected for ESP-TLS Kconfig
+ if(CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT)
+ set(CURRENT_SEARCH_DIR ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT})
+ get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" ABSOLUTE)
+ message(STATUS "WOLFSSL_ROOT found in sdkconfig/KConfig: ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT}")
else()
- message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:")
- message(STATUS "$ENV{WOLFSSL_ROOT}")
- endif()
- endif()
+ message(STATUS "wolfSSL not defined in [Component Config] [wolfssl]. Continuing search...")
+ # If not specified as a search hint in OUTPUT_FOUND_WOLFSSL_DIRECTORY:
+ # This wolfSSL component CMakeLists.txt may be found EITHER in:
+ # 1) local project component
+ # 2) ESP-IDF share components
+ # We'll start in the CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssl
+ # That option might find wolfSSL source code as a copy in the component directory (e.g. Managed Components)
+ # Unless cmake is in the ESP-IDF, in which case it is unlikely to find wolfSSL source in any parent.
+ message(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
+ get_filename_component(CURRENT_SEARCH_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
+ message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
+ string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH)
+ endif() # CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT
+ endif() # check environment var blank
else()
- get_filename_component(CURRENT_SEARCH_DIR "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}" ABSOLUTE)
+ message(STATUS "Parameter found for FIND_WOLFSSL_DIRECTORY")
+ message(STATUS "Setting wolfSSL search directory to: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}")
+ set(CURRENT_SEARCH_DIR "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}")
+ endif() # parameter empty
+
+ # Check to see if we found a path in environment or config settings, above.
+ if( "${CURRENT_SEARCH_DIR}" STREQUAL "" )
+ message(STATUS "Source for wolfSSL not specified in path nor config settings.")
+ # We'll continue the search by recursing up the directory tree, below.
+ else()
+ # Setting found! Does it contain a valid path?
+ string(REPLACE "\\" "/" CURRENT_SEARCH_DIR ${CURRENT_SEARCH_DIR})
+ get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" ABSOLUTE)
IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL)
if( FOUND_WOLFSSL )
- message(STATUS "Found WOLFSSL_ROOT via prior specification.")
+ message(STATUS "Found wolfSSL source code via setting: ${CURRENT_SEARCH_DIR}")
+ set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
+ return()
else()
- message(FATAL_ERROR "WOLFSSL_ROOT Variable defined, but path not found: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}")
+ if(WIN32)
+ message(STATUS "When specifying a path for Windows, use forward slahes, or double backslashes.")
+ endif()
+ message(STATUS "CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT sdkconfig setting = ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT}")
+ message(STATUS "WOLFSSL_ROOT Variable defined, but source code not found: ${CURRENT_SEARCH_DIR}")
endif()
endif()
@@ -280,6 +505,11 @@ endfunction()
message(STATUS "CONFIG_TARGET_PLATFORM = ${CONFIG_TARGET_PLATFORM}")
+# Check for environment variable that may be assigned to macros
+ENVIRONMENT_VAR_TO_MACRO("GENERATE_MACHINE_PARSEABLE_REPORT" "1")
+ENVIRONMENT_VAR_TO_MACRO("WOLFSSL_BENCHMARK_FIXED_CSV" "1")
+
+# Optional variable inspection
if (0)
get_cmake_property(_variableNames VARIABLES)
list (SORT _variableNames)
@@ -296,15 +526,25 @@ endif()
if ( ("${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266") OR ("${IDF_TARGET}" STREQUAL "esp8266") )
# There's no esp_timer, no driver components for the ESP8266
- message(STATUS "Early expansion EXCLUDES esp_timer: ${THIS_INCLUDE_TIMER}")
- message(STATUS "Early expansion EXCLUDES driver: ${THIS_INCLUDE_DRIVER}")
- set(THIS_INCLUDE_TIMER "")
- set(THIS_INCLUDE_DRIVER "")
+ message(STATUS "Early expansion EXCLUDES for esp8266:")
+ message(STATUS "THIS_INCLUDE_DRIVER: '${THIS_INCLUDE_DRIVER}'")
+ message(STATUS "THIS_INCLUDE_TIMER: '${THIS_INCLUDE_TIMER}'")
+ message(STATUS "Early expansion INCLUDE for esp8266:")
+ message(STATUS "THIS_INCLUDE_PTHREAD: '${THIS_INCLUDE_PTHREAD}'")
+ set(THIS_ESP_TLS "")
+ set(THIS_INCLUDE_DRIVER "")
+ set(THIS_INCLUDE_TIMER "")
+ set(THIS_INCLUDE_PTHREAD "pthread")
else()
message(STATUS "Early expansion includes esp_timer: ${THIS_INCLUDE_TIMER}")
message(STATUS "Early expansion includes driver: ${THIS_INCLUDE_DRIVER}")
- set(THIS_INCLUDE_TIMER "esp_timer")
+ set(THIS_ESP_TLS "esp-tls")
set(THIS_INCLUDE_DRIVER "driver")
+ set(THIS_INCLUDE_TIMER "esp_timer")
+ set(THIS_INCLUDE_PTHREAD "")
+ # Let the app know that we've included the esp-tls component requirement.
+ # This is critical for use the the esp-tls component. See wolfssl esp_crt_bundle.c file.
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_REQUIRED_ESP_TLS=1")
endif()
if(CMAKE_BUILD_EARLY_EXPANSION)
@@ -312,8 +552,10 @@ if(CMAKE_BUILD_EARLY_EXPANSION)
idf_component_register(
REQUIRES "${COMPONENT_REQUIRES}"
PRIV_REQUIRES # esp_hw_support
- ${THIS_INCLUDE_TIMER}
- ${THIS_INCLUDE_DRIVER} # this will typically only be needed for wolfSSL benchmark
+ "${THIS_ESP_TLS}"
+ "${THIS_INCLUDE_PTHREAD}"
+ "${THIS_INCLUDE_TIMER}"
+ "${THIS_INCLUDE_DRIVER}" # this will typically only be needed for wolfSSL benchmark
)
else()
@@ -322,6 +564,15 @@ else()
message(STATUS "wolfssl component config:")
message(STATUS "************************************************************************************************")
+ if ( "${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266")
+ # There's no esp_timer, no driver components for the ESP8266
+ set(THIS_INCLUDE_TIMER "")
+ set(THIS_INCLUDE_DRIVER "")
+ else()
+ set(THIS_INCLUDE_TIMER "esp_timer")
+ set(THIS_INCLUDE_DRIVER "driver")
+ endif()
+
# search for wolfSSL
FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
if(WOLFSSL_ROOT)
@@ -335,7 +586,9 @@ else()
# Abort CMake after fatal error.
endif()
else()
- message(STATUS "Searching for wolfSL source code...")
+ message(STATUS "Source code for wolfSSL still not found.")
+ message(STATUS "Searching from project home: ${CMAKE_HOME_DIRECTORY} ...")
+ set(WOLFSSL_ROOT "${CMAKE_HOME_DIRECTORY}")
FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
endif()
@@ -343,11 +596,18 @@ else()
if(WOLFSSL_ROOT)
message(STATUS "Confirmed wolfssl directory at: ${WOLFSSL_ROOT}")
else()
- message(STATUS "Failed: wolfssl directory not found.")
+ # Try to allow a more intuitive error that the source code was not found in cmake:
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_WARNING_SOURCE_NOT_FOUND")
+
+ message(STATUS "Failed: wolfssl source code directory not found.")
# Abort. We need wolfssl _somewhere_.
- message(FATAL_ERROR "Could not find wolfssl in any parent directory named wolfssl-${THIS_USER}, wolfssl-master, or wolfssl.\n"
- "Try setting WOLFSSL_ROOT environment variable, cmake variable in project, copy source, or use managed components.")
- # Abort CMake after fatal error.
+ message(STATUS "")
+ message(STATUS "")
+ message(STATUS "Could not find wolfssl in any parent directory named wolfssl-${THIS_USER}, wolfssl-master, or wolfssl.\n"
+ "Try setting WOLFSSL_ROOT environment variable, cmake variable in project, copy source, or use managed components.")
+ message(STATUS "")
+ message(STATUS "")
+ # Abort CMake after fatal error. (or not?)
endif()
set(INCLUDE_PATH ${WOLFSSL_ROOT})
@@ -373,22 +633,24 @@ else()
endif()
endif()
+ message(STATUS "WOLFSSL_EXTRA_PROJECT_DIR = ${WOLFSSL_EXTRA_PROJECT_DIR}")
set(COMPONENT_SRCDIRS "\"${WOLFSSL_ROOT}/src/\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif\""
+ "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif/esp_crt_bundle\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel\""
"\"${WOLFSSL_EXTRA_PROJECT_DIR}\""
) # COMPONENT_SRCDIRS
message(STATUS "This COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}")
- # wolfSSL user_settings.h is in the local project.
+ # wolfSSL user_settings.h may be in the local project.
+ # TODO check if exists and possibly set to ESP-IDF
set(WOLFSSL_PROJECT_DIR "${CMAKE_HOME_DIRECTORY}/components/wolfssl")
- # add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${WOLFSSL_PROJECT_DIR}/include/user_settings.h")
string(REPLACE "/" "//" STR_WOLFSSL_PROJECT_DIR "${WOLFSSL_PROJECT_DIR}")
- add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${STR_WOLFSSL_PROJECT_DIR}//include//user_settings.h")
-
+ add_compile_definitions(WOLFSSL_USER_SETTINGS_DIR="${STR_WOLFSSL_PROJECT_DIR}/include/user_settings.h")
+ message(STATUS "Added definition for user_settings.h: -DWOLFSSL_USER_SETTINGS_DIR=\"${STR_WOLFSSL_PROJECT_DIR}//include//user_settings.h\"")
# Espressif may take several passes through this makefile. Check to see if we found IDF
string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF)
@@ -421,8 +683,7 @@ else()
message(STATUS "**************************************************************************************")
message(STATUS "")
- message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.")
- # Abort CMake after fatal error.
+ message(STATUS "Please use wolfSSL in either local project or Espressif components, but not both.")
# Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING")
@@ -530,7 +791,9 @@ else()
# depending on the environment, we may need to swap backslashes with forward slashes
string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos")
- string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT})
+ if(WOLFSSL_ROOT)
+ string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT})
+ endif()
if(IS_DIRECTORY "${RTOS_IDF_PATH}")
message(STATUS "Found current RTOS path: ${RTOS_IDF_PATH}")
@@ -546,12 +809,16 @@ else()
message(STATUS "THIS_IDF_PATH = $THIS_IDF_PATH")
# wolfSSL-specific include directories
set(COMPONENT_ADD_INCLUDEDIRS
- "./include" # this is the location of wolfssl user_settings.h
+ "./include" # this is the location of local project wolfssl user_settings.h
"\"${WOLFSSL_ROOT}/\""
"\"${WOLFSSL_ROOT}/wolfssl/\""
"\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\""
"\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/port/Espressif\""
"\"${RTOS_IDF_PATH}/\""
+ # wolfSSL release after v5.7 includes WiFi, time, and mem/debug helpers
+ "${THIS_IDF_PATH}/components/esp_event/include"
+ "${THIS_IDF_PATH}/components/esp_netif/include"
+ "${THIS_IDF_PATH}/components/esp_wifi/include"
)
# Optionally include cryptoauthlib if present
@@ -579,8 +846,8 @@ else()
"\"${WOLFSSL_ROOT}/src/ssl_sess.c\"" # included by ssl.c
"\"${WOLFSSL_ROOT}/src/x509.c\""
"\"${WOLFSSL_ROOT}/src/x509_str.c\""
- "\"${WOLFSSL_ROOT}/wolfcrypt/src/ext_kyber.c\"" # external Kyber disabled by default
- "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/ext_kyber.h\"" # external Kyber disabled by default
+ "\"${WOLFSSL_ROOT}/wolfcrypt/src/ext_kyber.c\"" # external non-wolfssl Kyber disabled by default
+ "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/ext_kyber.h\"" # external non-wolfssl Kyber disabled by default
"\"${WOLFSSL_ROOT}/wolfcrypt/src/evp.c\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/misc.c\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm32.c\""
@@ -591,6 +858,7 @@ else()
"\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_cortexm.c\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64.c\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64_asm.S\""
+ "\"${WOLFSSL_ROOT}/examples\"" # Examples are distributed in Managed Components, but not part of a project.
"\"${EXCLUDE_ASM}\""
)
@@ -612,15 +880,226 @@ else()
# see https://docs.espressif.com/projects/esp-idf/en/stable/esp32/migration-guides/release-5.x/build-system.html?highlight=space%20path
#
set(EXTRA_COMPONENT_DIRS "${COMPONENT_SRCDIRS}")
- idf_component_register(
- SRC_DIRS "${COMPONENT_SRCDIRS}"
- INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}"
- REQUIRES "${COMPONENT_REQUIRES}"
- EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}"
- PRIV_REQUIRES
- "${THIS_INCLUDE_TIMER}"
- "${THIS_INCLUDE_DRIVER}" # this will typically only be needed for wolfSSL benchmark
- )
+
+ if(WOLFSSL_ROOT)
+ # Only register the component if we found wolfSSL source.
+ # This is important to allow Cmake to finish to completion, otherwise the UI
+ # may not be able to display the Kconfig settings to fix a bad or missing source.
+ idf_component_register(
+ SRC_DIRS "${COMPONENT_SRCDIRS}"
+ INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}"
+ REQUIRES "${COMPONENT_REQUIRES}"
+ EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}"
+ PRIV_REQUIRES
+ "${THIS_ESP_TLS}"
+ "${THIS_INCLUDE_TIMER}"
+ "${THIS_INCLUDE_DRIVER}" # this will typically only be needed for wolfSSL benchmark
+ )
+ else()
+ # Register the component simply to allow CMake to complete, but there's no wolfSSL source.
+ # Expect many other errors, but the project should at least be loadable and UI can edit Kconfig settings.
+ idf_component_register()
+ message(STATUS "Warning: wolfSSL component not registered as no source code found (WOLFSSL_ROOT is blank)")
+ endif()
+
+# function(WOLFSSL_INIT_CERT_BUNDLE)
+if( CONFIG_WOLFSSL_CERTIFICATE_BUNDLE
+ AND NOT CONFIG_WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_NONE
+ AND NOT ("${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266")
+ )
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("wolfSSL Certificate Bundles Enabled")
+
+ if (CMAKE_BUILD_EARLY_EXPANSION)
+ message(FATAL_ERROR "Bundle Cert initialization must occur during CMAKE_BUILD_EARLY_EXPANSION")
+ endif()
+ # reminder: we need a value for wolfSSL root first!
+ if( "${WOLFSSL_ROOT}" STREQUAL "" )
+ message(FATAL_ERROR "Certificate bundles need a value for WOLFSSL_ROOT")
+ endif()
+
+ # Cert bundle in wolfSSL source unless otherwise specified later
+ set(WOLFSSL_ESP_CRT_BUNDLE_DIR ${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif/esp_crt_bundle)
+ message(STATUS "WOLFSSL_ESP_CRT_BUNDLE_DIR=${WOLFSSL_ESP_CRT_BUNDLE_DIR}")
+
+ if(DEFINED ENV{PLATFORMIO_PROJECT_DIR})
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Detected PlatformIO")
+ set(IS_PLATFORMIO 1)
+ else()
+ # Some environments may not have environment variable, so double check if we are in .pio
+ if("${CMAKE_BINARY_DIR}" MATCHES "/\\.pio/")
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Detected PlatformIO via CMAKE_BINARY_DIR")
+ set(IS_PLATFORMIO 1)
+ else()
+ set(IS_PLATFORMIO 0)
+ endif()
+ endif()
+
+ if(EXISTS "${WOLFSSL_ESP_CRT_BUNDLE_DIR}" OR IS_PLATFORMIO)
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Special processing for wolfSSL Certificate Bundles")
+ set(bundle_name "x509_crt_bundle_wolfssl")
+
+ # For now the certs are in the same directory
+ set(DEFAULT_CRT_DIR "${WOLFSSL_ESP_CRT_BUNDLE_DIR}")
+
+ # Generate custom certificate bundle using the generate_cert_bundle utility
+ set(GENERATE_CERT_BUNDLEPY ${python} ${WOLFSSL_ESP_CRT_BUNDLE_DIR}/gen_crt_bundle.py)
+
+ if(CONFIG_WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_FULL)
+ list(APPEND crt_paths ${DEFAULT_CRT_DIR}/cacrt_all.pem ${DEFAULT_CRT_DIR}/cacrt_local.pem)
+ elseif(CONFIG_WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_CMN)
+ list(APPEND crt_paths ${DEFAULT_CRT_DIR}/cacrt_all.pem ${DEFAULT_CRT_DIR}/cacrt_local.pem)
+ list(APPEND args --filter ${DEFAULT_CRT_DIR}/cmn_crt_authorities.csv)
+ endif()
+
+ # Add deprecated root certs if enabled. This config is not visible if the default cert
+ # bundle is not selected
+ if(CONFIG_WOLFSSL_CERTIFICATE_BUNDLE_DEPRECATED_LIST)
+ list(APPEND crt_paths ${DEFAULT_CRT_DIR}/cacrt_deprecated.pem)
+ endif()
+
+ if(CONFIG_WOLFSSL_CUSTOM_CERTIFICATE_BUNDLE)
+ get_filename_component(custom_bundle_path
+ ${CONFIG_WOLFSSL_CUSTOM_CERTIFICATE_BUNDLE_PATH} ABSOLUTE BASE_DIR "${project_dir}")
+ list(APPEND crt_paths ${custom_bundle_path})
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Using a custom wolfSSL bundle path: ${custom_bundle_path}")
+ else()
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Not using a custom wolfSSL bundle path")
+ endif()
+ list(APPEND args --input ${crt_paths} -q)
+
+ message(STATUS "CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")
+ get_filename_component(crt_bundle
+ ${bundle_name}
+ ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+
+ message(STATUS "Setting up bundle generate: ${GENERATE_CERT_BUNDLEPY} ${args}")
+ message(STATUS "Depends on custom bundle path: ${custom_bundle_path}")
+ message(STATUS "crt_bundle ${crt_bundle}")
+ message(STATUS "COMPONENT_LIB ${COMPONENT_LIB}")
+ message(STATUS "GENERATE_CERT_BUNDLEPY ${GENERATE_CERT_BUNDLEPY}")
+ message(STATUS "args ${args}")
+ message(STATUS "cert_bundle ${cert_bundle}")
+
+ if (IS_PLATFORMIO)
+ # PlatformIO cannot generate a Certificate Bundle at build time
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("PlatformIO is using a predefined bundle rather than generating one")
+
+ if ( "${WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}" STREQUAL "" OR "$(WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE)" STREQUAL "" OR "$(WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE)" STREQUAL "n")
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Alternate Certificate Bundle Path and Name not enabled, assuming [project]/certs/x509_crt_bundle_wolfssl")
+ # Reminder this CMakeLists.txt should be in [project]/components/wolfssl, so ./certs is two directories up
+ set(crt_bundle_option "../../certs/x509_crt_bundle_wolfssl")
+ else()
+ string(SUBSTRING "${CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}" 0 2 CERT_PATH_FIRST_TWO)
+ if(CERT_PATH_FIRST_TWO STREQUAL "./" OR CERT_PATH_FIRST_TWO STREQUAL ".\\")
+ set(IS_CERT_BUNDLE_RELATIVE_PATH 1)
+ message(STATUS "Alternate Cert Path is relative to project.")
+ else()
+ set(IS_CERT_BUNDLE_RELATIVE_PATH 0)
+ message(STATUS "Alternate Cert Path is not relative to project.")
+ endif()
+
+ # The cert bundle is not a standard cert, so we con't add to the crt_paths.
+ # Still, we may have an alternate location, particulatly needed for PlatformIO:
+ if(IS_CERT_BUNDLE_RELATIVE_PATH)
+ message(STATUS "CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME = ${CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}")
+ message(STATUS "Relative alternate_bundle_path: ${alternate_bundle_path}")
+
+ SET(crt_bundle_option "${CMAKE_SOURCE_DIR}/${CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}")
+ else()
+ message(STATUS "alternate_bundle_path: ${CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}")
+ message(STATUS "Not using an alternate wolfSSL bundle file.")
+ SET(crt_bundle_option "${CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}")
+ endif()
+ endif()
+
+ # Clean the path, removing any extra "./" etc.
+ # Number of spaces in message strings is to align path value outputs
+ message(STATUS "This crt_bundle_option value: ${crt_bundle_option}")
+ if(${CMAKE_VERSION} VERSION_LESS "3.19")
+ message("WARNING: CMake version is ${CMAKE_VERSION} ? file(REAL_PATH ...) is not supported. Falling back to manual path normalization.")
+ # optional fallback logic here
+ get_filename_component(crt_bundle_file_component "${crt_bundle_option}" ABSOLUTE)
+ message(STATUS "Interim crt_bundle_file_component: ${crt_bundle_file_component}")
+ file(TO_CMAKE_PATH "${crt_bundle_file_component}" crt_bundle)
+ message(STATUS "TO_CMAKE_PATH crt_bundle result: ${crt_bundle}")
+ # set(crt_bundle "C:/workspace/pio_wolfssl-upstream-test-wolfssl_cert_bundle/esp32-c6/certs/x509_crt_bundle_wolfssl")
+ else()
+ file(REAL_PATH "${crt_bundle_option}" crt_bundle)
+ endif()
+
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Certificate Bundle: ${crt_bundle}")
+ message(STATUS "This cleaned crt_bundle value: ${crt_bundle}")
+ message(STATUS "=============================================================================================================")
+ message(STATUS "=============================================================================================================")
+ message(STATUS "Reminder: platformio.ini will need this value set for board_build.embed_files =")
+ message(STATUS "${crt_bundle}")
+ message(STATUS "=============================================================================================================")
+ message(STATUS "=============================================================================================================")
+
+ # e.g. SET(crt_bundle "C:/workspace/pio_wolfssl/esp32-c6/certs/x509_crt_bundle_wolfssl")
+ #
+
+ # Normally x509_crt_bundle_wolfssl built by python script called from cmake.
+ # See https://github.com/wolfSSL/wolfssl/blob/master/wolfcrypt/src/port/Espressif/esp_crt_bundle/gen_crt_bundle.py
+ # Reminder ESP-IDF scripts are NOT called from CMake for PlatformIO builds.
+ #
+ # The easiest way to generate the default file is to build with ESP-IDF and copy the files to [project]/main
+ #
+ # for example:
+ # build\VisualGDB\Debug\x509_crt_bundle_wolfssl.s
+ # build\VisualGDB\Debug\esp-idf\wolfssl\x509_crt_bundle_wolfssl
+ #
+ message(STATUS "Confirming cert bundle exists...")
+ if(EXISTS "${crt_bundle}")
+ # Number of spaces is to align path value outputs
+ message(STATUS "Bundle file found for PlatformIO: ${crt_bundle}")
+ else()
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("ERROR: Failed to find bundle file found for PlatformIO: ${crt_bundle}")
+ message(STATUS "Check for entry in platformio.ini: board_build.embed_files = certs/x509_crt_bundle_wolfssl ")
+ message(FATAL_ERROR "WOLFSSL_CERTIFICATE_BUNDLE is enabled for PlatformIO, but predefined file not found: ${crt_bundle}")
+ endif()
+ else()
+ # APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Generate bundle: ${GENERATE_CERT_BUNDLEPY} ${args}")
+ # Not PlatformIO
+ # Generate bundle according to config
+ # File is generated at build time, not cmake load
+ add_custom_command(OUTPUT ${crt_bundle}
+ COMMAND ${GENERATE_CERT_BUNDLEPY} ARGS ${args}
+ DEPENDS ${custom_bundle_path}
+ VERBATIM)
+
+ if(EXISTS "${crt_bundle}")
+ message(STATUS "Bundle file exists from prior build: ${crt_bundle}")
+ else()
+ message(STATUS "Bundle file expected during next build: ${crt_bundle}")
+ endif()
+
+ # Reminder the file is generated at build time, not cmake load time.
+ message(STATUS "wolfSSL Cert Bundle File to be created at build time in: ${crt_bundle}")
+ endif()
+
+ add_custom_target(custom_wolfssl_bundle DEPENDS ${crt_bundle})
+
+ # the wolfSSL certificate bundle is baked into wolfSSL
+ add_dependencies(${COMPONENT_LIB} custom_wolfssl_bundle)
+
+ # COMPONENT_LIB may vary: __idf_wolfssl, __idf_esp_wolfssl, etc
+ # target_add_binary_data(__idf_wolfssl ${crt_bundle} BINARY)
+ target_add_binary_data(${COMPONENT_LIB} ${crt_bundle} BINARY)
+ set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+ APPEND PROPERTY ADDITIONAL_CLEAN_FILES
+ "${crt_bundle}")
+ else()
+ if(IS_PLATFORMIO)
+ message(STATUS "WARNING: CONFIG_WOLFSSL_CERTIFICATE_BUNDLE enabled but cannot be generated in PlatformmIO")
+ else()
+ message(STATUS "WARNING: CONFIG_WOLFSSL_CERTIFICATE_BUNDLE enabled but directory not found: ${WOLFSSL_ESP_CRT_BUNDLE_DIR}")
+ endif()
+ message(FATAL_ERROR "not detected")
+ endif()
+endif()
+
+# endfunction() # WOLFSSL_INIT_CERT_BUNDLE
# Some optional diagnostics. Verbose ones are truncated.
if (VERBOSE_COMPONENT_MESSAGES)
@@ -652,6 +1131,12 @@ else()
endif()
# target_sources(wolfssl PRIVATE "\"${WOLFSSL_ROOT}/wolfssl/\"" "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt\"")
+ message(STATUS "DETECTED_PROJECT_NAME=${CMAKE_PROJECT_NAME}")
+ message(STATUS "COMPONENT_TARGET=${COMPONENT_TARGET}")
+ target_compile_definitions(${COMPONENT_TARGET} PRIVATE DETECTED_PROJECT_NAME="${CMAKE_PROJECT_NAME}")
+ if( "${CMAKE_PROJECT_NAME}" STREQUAL "esp_http_client_example" )
+ target_compile_definitions(${COMPONENT_TARGET} PRIVATE APP_ESP_HTTP_CLIENT_EXAMPLE="y")
+ endif()
endif() # CMAKE_BUILD_EARLY_EXPANSION
@@ -669,71 +1154,97 @@ endif()
# end multiple component check
-#
-# LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT)
-#
-# Save the THIS_VAR as a string in a macro called VAR_OUPUT
-#
-# VAR_OUPUT: the name of the macro to define
-# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process()
-# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful.
-#
-function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT )
- # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true.
- string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE)
-
- # if we had a successful operation, save the THIS_VAR in VAR_OUPUT
- if(${IS_VALID_VALUE})
- # strip newline chars in THIS_VAR parameter and save in VAR_VALUE
- string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR})
-
- # we'll could percolate the value to the parent for possible later use
- # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE)
-
- # but we're only using it here in this function
- set(${VAR_OUPUT} ${VAR_VALUE})
-
- # we'll print what we found to the console
- message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}")
-
- # the interesting part is defining the VAR_OUPUT name a value to use in the app
- add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\")
- else()
- # if we get here, check the execute_process command and parameters.
- message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT")
- set(${VAR_OUPUT} "Unknown")
- endif()
-endfunction() # LIBWOLFSSL_SAVE_INFO
+execute_process(
+ COMMAND ${git_cmd} "rev-parse" "--is-inside-work-tree"
+ OUTPUT_VARIABLE IS_GIT_REPO
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_QUIET
+)
# create some programmatic #define values that will be used by ShowExtendedSystemInfo().
# see wolfcrypt\src\port\Espressif\esp32_utl.c
-if(NOT CMAKE_BUILD_EARLY_EXPANSION)
+if(NOT CMAKE_BUILD_EARLY_EXPANSION AND WOLFSSL_ROOT AND (IS_GIT_REPO STREQUAL "true"))
set (git_cmd "git")
message(STATUS "Adding macro definitions:")
# LIBWOLFSSL_VERSION_GIT_ORIGIN: git config --get remote.origin.url
- execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
+ execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url"
+ OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_ORIGIN "${TMP_OUT}" "${TMP_RES}")
# LIBWOLFSSL_VERSION_GIT_BRANCH: git rev-parse --abbrev-ref HEAD
- execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
+ execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD"
+ OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_BRANCH "${TMP_OUT}" "${TMP_RES}")
# LIBWOLFSSL_VERSION_GIT_HASH: git rev-parse HEAD
- execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
+ execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD"
+ OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}")
# LIBWOLFSSL_VERSION_GIT_SHORT_HASH: git rev-parse --short HEAD
- execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
+ execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD"
+ OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}")
# LIBWOLFSSL_VERSION_GIT_HASH_DATE git show --no-patch --no-notes --pretty=\'\%cd\'
- execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES )
+ execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd}
+ "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'"
+ OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES )
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}")
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_WOLFSSL_ROOT "${WOLFSSL_ROOT}" "${TMP_RES}")
- message(STATUS "************************************************************************************************")
- message(STATUS "wolfssl component config complete!")
- message(STATUS "************************************************************************************************")
endif()
+
+# Ensure flag "-DWOLFSSL_ESPIDF" is already in CMAKE_C_FLAGS if not yet found from project
+string(FIND "${CMAKE_C_FLAGS}" "-DWOLFSSL_ESPIDF" FLAG_ALRREADY_FOUND_WOLFSSL_ESPIDF)
+
+if(FLAG_ALRREADY_FOUND_WOLFSSL_ESPIDF EQUAL -1)
+ # Flag not found, append it
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_ESPIDF")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS")
+endif()
+
+if(WOLFSSL_ROOT)
+ message(STATUS "Using wolfSSL in ${WOLFSSL_ROOT}")
+
+ # PlatformIO does not process script from from the Espressif cmake process.
+ # We need to know where wolfSSL source code was found, so save it in the
+ # PIO_WOLFSSL_ROOT environment variable to later be read by extra_script.py
+
+ set(ENV{PIO_WOLFSSL_ROOT} "${WOLFSSL_ROOT}")
+ message(STATUS "PIO_WOLFSSL_ROOT = $ENV{PIO_WOLFSSL_ROOT}")
+ message(STATUS "PLATFORMIO_BUILD_DIR = $ENV{PLATFORMIO_BUILD_DIR}")
+ # See esp-tls Kconfig; menu "ESP-TLS", ESP_TLS_LIBRARY_CHOOSE
+ if(CONFIG_ESP_TLS_USING_WOLFSSL)
+ if ( ("${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266") OR ("${IDF_TARGET}" STREQUAL "esp8266") )
+ message(STATUS "This version of wolfSSL is not supported on the ESP8266 esp-tls at this time. Check ESP-TLS config")
+ else()
+ message(STATUS "wolfSSL will be used for ESP-TLS")
+ endif()
+ else()
+ message(STATUS "WARNING: wolfSSL NOT selected for ESP-TLS. Features and performance will be limited.")
+ endif()
+else()
+ message(STATUS "")
+ message(STATUS "Consider setting WOLFSSL_ROOT environment variable, use Kconfig setting, or set manually in this cmake file, above.")
+ message(STATUS "")
+ message(STATUS "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message(STATUS "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message(STATUS "ERROR: Could not find wolfSSL Source Code")
+ message(STATUS "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message(STATUS "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+endif()
+
+# A single instance of potentially multiple cmake messages to send to app:
+message(STATUS "LIBWOLFSSL_CMAKE_OUTPUT: ${LIBWOLFSSL_CMAKE_OUTPUT}")
+LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_CMAKE_OUTPUT "${LIBWOLFSSL_CMAKE_OUTPUT}" "0")
+
+file(APPEND "${CMAKE_BINARY_DIR}/libwolfssl_output.h"
+ "\n"
+ "#endif\n" )
+
+message(STATUS "************************************************************************************************")
+message(STATUS "wolfSSL component config complete!")
+message(STATUS "************************************************************************************************")
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/Kconfig b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/Kconfig
new file mode 100644
index 00000000..4821188b
--- /dev/null
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/Kconfig
@@ -0,0 +1,552 @@
+# Kconfig template
+#
+# Copyright (C) 2014-2025 wolfSSL Inc.
+#
+# This file is part of wolfSSH.
+#
+# wolfSSH is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# wolfSSH is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with wolfSSH. If not, see .
+#
+
+# Kconfig File Version 5.7.2.001 for esp-idf integration
+
+# Kconfig Format Rules
+#
+# See:
+# https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/kconfig.html
+#
+# Format rules for Kconfig files are as follows:
+#
+# Option names in any menus should have consistent prefixes. The prefix
+# currently should have at least 3 characters.
+#
+# The unit of indentation should be 4 spaces. All sub-items belonging to a
+# parent item are indented by one level deeper. For example, menu is indented
+# by 0 spaces, config menu by 4 spaces, help in config by 8 spaces, and the
+# text under help by 12 spaces.
+#
+# No trailing spaces are allowed at the end of the lines.
+#
+# The maximum length of options is NOT 50 characters as documented.
+# kconfcheck will complain that options should be 40 at most.
+#
+# Fix option lengths first. Superfluous errors on other lines may occur.
+#
+# The maximum length of lines is 120 characters.
+#
+# python -m kconfcheck
+#
+# ---------------------------------------------------------------------------------------------------------------------
+# Begin main wolfSSL configuration menu
+# ---------------------------------------------------------------------------------------------------------------------
+# See ESP-IDF esp-tls component for config TLS_STACK_WOLFSSL
+
+menu "wolfSSL"
+
+ menu "Hardening"
+ config ESP_WOLFSSL_WC_NO_HARDEN
+ bool "Disable wolfSSL hardening"
+ default n
+ help
+ Sets WC_NO_HARDEN
+
+ config ESP_WOLFSSL_TFM_TIMING_RESISTANT
+ bool "Enable TFM Timing Resistant Code"
+ default n
+ help
+ Sets TFM_TIMING_RESISTANT.
+
+ endmenu # Hardening
+
+ config ESP_WOLFSSL_ENABLE_BENCHMARK
+ bool "Enable wolfSSL Benchmark Library"
+ default n
+ help
+ Enables wolfcrypt/benchmark/benchmark.c code for benchmark metrics. Disables NO_CRYPT_BENCHMARK.
+
+
+ menu "Benchmark Debug"
+ config ESP_DEBUG_WOLFSSL_BENCHMARK_TIMING
+ bool "Enable benchmark timing debug"
+ depends on ESP_WOLFSSL_ENABLE_BENCHMARK
+ default n
+ help
+ Enable wolfssl debug for benchmark metric timing (CPU Cycles, RTOS ticks, etc).
+
+ config ESP_WOLFSSL_BENCHMARK_TIMER_DEBUG
+ bool "Enable benchmark timer debug"
+ depends on ESP_WOLFSSL_ENABLE_BENCHMARK
+ default n
+ help
+ Turn on timer debugging (used when CPU cycles not available)
+
+ endmenu # Benchmark Debug
+
+ # -----------------------------------------------------------------------------------------------------------------
+ # wolfCrypt Test
+ # -----------------------------------------------------------------------------------------------------------------
+ config ESP_WOLFSSL_ENABLE_TEST
+ bool "Enable wolfCrypt Test Library"
+ default n
+ help
+ Enables wolfcrypt/test/test.c code for testing. Disables NO_CRYPT_TEST.
+
+ menu "wolfCrypt tests"
+ config WOLFSSL_HAVE_WOLFCRYPT_TEST_OPTIONS
+ bool "Enable wolfCrypt Test Options"
+ depends on ESP_WOLFSSL_ENABLE_TEST
+ default n
+ help
+ Enables HAVE_WOLFCRYPT_TEST_OPTIONS
+
+ config TEST_ESPIDF_ALL_WOLFSSL
+ bool "Enable all features to use in tests"
+ depends on ESP_WOLFSSL_ENABLE_TEST
+ default n
+ help
+ Enables TEST_ESPIDF_ALL_WOLFSSL
+
+ endmenu # wolfCrypt tests
+
+ # -----------------------------------------------------------------------------------------------------------------
+ # Apple HomeKit Options
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "Apple HomeKit"
+ config WOLFSSL_APPLE_HOMEKIT
+ bool "Enable Apple HomeKit options"
+ default n
+ help
+ Enables FP_MAX_BITS (8192 * 2), SRP, ChaCha, Poly1305, Base64 encoding needed for Apple HomeKit.
+ endmenu # Apple HomeKit
+ # -----------------------------------------------------------------------------------------------------------------
+
+ config ESP_WOLFSSL_DISABLE_MY_ECC
+ bool "Disable ECC in my project"
+ default "n"
+ help
+ ECC is enabled by default. Select this option to disable.
+
+ config ESP_WOLFSSL_ENABLE_MY_USE_RSA
+ bool "Enable RSA in my project"
+ default "n"
+ help
+ RSA is disabled by default. Select this option to enable.
+
+ config ESP_WOLFSSL_BENCHMARK
+ bool "Enable wolfSSL Benchmark"
+ default n
+ help
+ Enables user settings relevant to benchmark code
+
+ config ESP_TLS_USING_WOLFSSL_SPECIFIED
+ bool "Use the specified wolfssl for ESP-TLS"
+ default Y
+ help
+ Includes wolfSSL from specified directory (not using esp-wolfssl).
+
+ config ESP_WOLFSSL_NO_USE_FAST_MATH
+ bool "Disable FAST_MATH library and all ESP32 Hardware Acceleration"
+ select ESP_WOLFSSL_NO_HW
+ select ESP_WOLFSSL_NO_HW_AES
+ select ESP_WOLFSSL_NO_HW_HASH
+ select ESP_WOLFSSL_NO_HW_RSA_PRI
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_MP_MUL
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_MULMOD
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_EXPTMOD
+ default n
+ help
+ When disabling all hardware acceleration for smaller memory footprint,
+ disabling TFM fast math provides faster wolfSSL software algorithms in an
+ even smaller flash memory footprint.
+
+ menu "Protocol Config"
+ config WOLFSSL_HAVE_ALPN
+ bool "Enable ALPN (Application Layer Protocol Negotiation) in wolfSSL"
+ default y
+
+ config WOLFSSL_ALLOW_TLS13
+ bool "Allow TLS 1.3"
+ default y
+ help
+ Allow TLS to fallback to TLS1.2. Memory footprint will likely be larger for TLS1.2.
+ When disabled HTTPS and MQTT over TLS connections will fail if TLS1.3 not accepted.
+
+ config WOLFSSL_ALLOW_TLS12
+ bool "Allow TLS 1.2"
+ default n
+ help
+ Allow TLS to fallback to TLS1.2. Memory footprint will likely be larger for TLS1.2.
+ When disabled HTTPS and MQTT over TLS connections will fail if TLS1.3 not accepted.
+
+ config WOLFSSL_HAVE_TLS_EXTENSIONS
+ bool "Enable TLS Extensions"
+ default y
+ help
+ Sets HAVE_TLS_EXTENSIONS which is needed for TLS 1.3, SNI, ALPN, and more.
+
+ config WOLFSSL_ALT_CERT_CHAINS
+ bool "Enable Alternate Certificate Chains"
+ default n
+ help
+ The option relaxes the default strict wolfSSL certificate chain processing. This
+ will typically need to be enabled when loading only a CA file. Typically solves
+ the -188 ASN_NO_SIGNER_E error. Use with caution.
+
+ config WOLFSSL_HAVE_OCSP
+ bool "Enable OCSP (Online Certificate Status Protocol) in wolfSSL"
+ default n
+ help
+ Sets HAVE_OCSP
+
+ endmenu # Protocol Config
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ config TLS_STACK_WOLFSSL
+ # Invisible option that locks TLS_STACK_WOLFSSL to ESP_TLS_USING_WOLFSSL
+ bool
+ default n
+ select FREERTOS_ENABLE_BACKWARD_COMPATIBILITY
+ help
+ Includes wolfSSL in ESP-TLS so that it can be compiled with wolfSSL as its SSL/TLS library.
+ Enabled when wolfSSL is selected in ESP_TLS_LIBRARY_CHOOSE.
+
+ menu "wolfSSL ESP-TLS"
+ depends on ESP_TLS_USING_WOLFSSL
+
+ menu "Certificate Bundle"
+ depends on ESP_TLS_USING_WOLFSSL
+
+ config WOLFSSL_CERTIFICATE_BUNDLE
+ bool "Enable trusted root certificate bundle"
+ default y if ESP_TLS_USING_WOLFSSL
+ default n
+ depends on ESP_TLS_USING_WOLFSSL
+ help
+ Enable support for large number of default root certificates
+
+ When enabled this option allows user to store default as well
+ as customer specific root certificates in compressed format rather
+ than storing full certificate. For the root certificates the public key and the subject name
+ will be stored.
+
+ config WOLFSSL_NO_ASN_STRICT
+ bool "Relax Certificate ASN Strict Checks"
+ default n
+ depends on ESP_TLS_USING_WOLFSSL
+ help
+ Allows sub-optimal certificate ASN checks. Unless using a bundle with known issues,
+ it is recommended to NOT enable this.
+
+ config WOLFSSL_ASN_ALLOW_0_SERIAL
+ bool "Allow cert missing an ASN Serial Number"
+ default y
+ depends on ESP_TLS_USING_WOLFSSL
+ help
+ Although not recommended, there may be certificates in the bundle that are missing
+ a serial number. This option allows the missing value without having to fully
+ disable strict ASN checking with WOLFSSL_NO_ASN_STRICT.
+
+ choice WOLFSSL_DEFAULT_CERTIFICATE_BUNDLE
+ bool "Default certificate bundle options"
+ depends on WOLFSSL_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+ default WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_FULL
+
+ config WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_FULL
+ bool "Use the full default certificate bundle"
+ config WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_CMN
+ bool "Use only the most common certificates from the default bundles"
+ help
+ Use only the most common certificates from the default bundles, reducing the size with 50%,
+ while still having around 99% coverage.
+ config WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_NONE
+ bool "Do not use the default certificate bundle"
+ endchoice
+
+ config WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE
+ depends on WOLFSSL_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+ default n
+ bool "Use alternate certificate bundle"
+ help
+ Typically only used for PlatformIO which cannot generate a certificate bundle at build time.
+ Enable this option to specify a fixed wolfSSL certificate file path and file name.
+
+ config WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME
+ depends on WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+ string "Default certificate bundle alternate path and name"
+ default "./certs/x509_crt_bundle_wolfssl"
+ help
+ Name of the default certificate bundle directory. Typically used only with PlatformIO.
+ Reminder PlatformIO cannot generate a bundle from cmake python script call. Relative
+ paths are with respect to root of this project.
+
+ config WOLFSSL_CUSTOM_CERTIFICATE_BUNDLE
+ depends on WOLFSSL_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+ default n
+ bool "Add custom certificates to the default bundle"
+
+ config WOLFSSL_CUSTOM_CERTIFICATE_BUNDLE_PATH
+ depends on WOLFSSL_CUSTOM_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+ string "Custom certificate bundle path"
+ help
+ Name of the custom certificate directory or file. This path is evaluated
+ relative to the project root directory.
+
+ config WOLFSSL_CERTIFICATE_BUNDLE_DEPRECATED_LIST
+ bool "Add deprecated root certificates"
+ depends on WOLFSSL_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL && !WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_NONE
+ help
+ Include the deprecated list of root certificates in the bundle.
+ This list gets updated when a certificate is removed from the Mozilla's
+ NSS root certificate store. This config can be enabled if you would like
+ to ensure that none of the certificates that were deployed in the product
+ are affected because of the update to bundle. In turn, enabling this
+ config keeps expired, retracted certificates in the bundle and it may
+ pose a security risk.
+
+ - Deprecated cert list may grow based based on sync with upstream bundle
+ - Deprecated certs would be be removed in ESP-IDF (next) major release
+
+ config WOLFSSL_CERTIFICATE_BUNDLE_MAX_CERTS
+ int "Maximum no of certificates allowed in certificate bundle"
+ default 200
+ depends on WOLFSSL_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+
+ endmenu
+ endmenu # wolfSSL ESP-TLS
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ config ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ bool "Modify default hardware acceleration settings"
+ default n
+ help
+ When disabling all hardware acceleration for smaller memory footprint,
+ disabling TFM fast math provides faster wolfSSL software algorithms in an
+ even smaller flash memory footprint.
+ Typically used for debugging, analysis, or optimizations. The default
+ hardware acceleration features can be each manually adjusted.
+
+ menu "wolfSSL Hardware Acceleration"
+
+ config ESP_WOLFSSL_NO_ESP32_CRYPT
+ bool "Disable all ESP32 Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ select ESP_WOLFSSL_NO_HW_AES
+ select ESP_WOLFSSL_NO_HW_HASH
+ select ESP_WOLFSSL_NO_HW_RSA_PRI
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_MP_MUL
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_MULMOD
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_EXPTMOD
+ help
+ Hardware acceleration enabled by default. When selected defines: NO_ESP32_CRYPT.
+ Consider disabling FASTMATH (other libraries are faster in software and smaller)
+
+ config ESP_WOLFSSL_NO_HW_AES
+ bool "Disable all ESP32 AES Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ help
+ Hardware acceleration enabled by default.When selected defines: NO_HW_AES
+
+ config ESP_WOLFSSL_NO_HW_HASH
+ bool "Disable all ESP32 SHA Hash Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ help
+ Hardware acceleration enabled by default. When selected defines: NO_HW_HASH
+
+ config ESP_WOLFSSL_NO_HW_RSA_PRI
+ bool "Disable all ESP32 RSA Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ select ESP_WOLFSSL_NO_HW_PRI_MP_MUL
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_MULMOD
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_EXPTMOD
+ help
+ Hardware acceleration enabled by default. When selected defines: NO_HW_RSA_PRI
+
+ config ESP_WOLFSSL_NO_HW_RSA_PRI_MP_MUL
+ bool "Disable all ESP32 Multiplication Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ help
+ Hardware acceleration enabled by default. When selected defines: NO_HW_RSA_PRI_MP_MUL
+
+ config ESP_WOLFSSL_NO_HW_RSA_PRI_MULMOD
+ bool "Disable all ESP32 Modular Multiplication Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ help
+ Hardware acceleration enabled by default. When selected defines: NO_HW_RSA_PRI_MULMOD
+
+ config ESP_WOLFSSL_NO_HW_RSA_PRI_EXPTMOD
+ bool "Disable all ESP32 RSA Exponential Math Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ help
+ Hardware acceleration enabled by default.
+ Select this option to force disable: NO_HW_RSA_PRI_EXPTMOD
+
+ config ESP_WOLFSSL_DEBUG_ESP_HW_MULTI_RSAMAX_BITS
+ bool "Enable debugging of RSA Multiplication operand length"
+ default n
+ help
+ Prints an esp log warning to the default console UART when one of the
+ multiplication operands exceeds the maximum size supported by hardware,
+ requiring fallback to software. This can be helpful to pick key sizes
+ when performance is critical. See also metrics for counting instances.
+
+ config ESP_WOLFSSL_DEBUG_ESP_HW_MOD_RSAMAX_BITS
+ bool "Enable debugging of RSA Modular operand length"
+ default n
+ help
+ Prints an esp log warning to the default console UART when one of the
+ modular math operands exceeds the maximum size supported by hardware,
+ requiring fallback to software. This can be helpful to pick key sizes
+ when performance is critical. See also metrics for counting instances.
+
+ endmenu # wolfSSL Hardware Acceleration
+
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "wolfSSL Post Quantum Kyber KEM PQ"
+
+ config ESP_WOLFSSL_ENABLE_MLKEM
+ bool "Enable ML-KEM (Kyber Post Quantum)"
+ default n
+ help
+ bool "Enable wolfSSL ML-KEM"
+
+ config WOLFSSL_ENABLE_KYBER
+ bool "Enable Kyber (Round 3)"
+ default n
+ help
+ Enable old compatibility with Kyber Round 3 (enables experimental settings)
+
+ endmenu # wolfSSL Post Quantum Kyber KEM PQ
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "wolfSSL Debug Options"
+ config ESP_WOLFSSL_DEBUG_WOLFSSL
+ bool "Enable wolfSSL Debugging"
+ default n
+ help
+ Enable debugging messages for wolfSSL. See user_settings.h for additional debug options.
+
+ config ESP_WOLFSSL_NO_STACK_SIZE_BUILD_WARNING
+ bool "Suppress build-time warnings for main stack size"
+ default n
+ help
+ Useful only when wolfSSL is running in main task. See FreeRTOS stack size for custom tasks.
+
+ config ESP_WOLFSSL_TEST_LOOP
+ bool "Run test apps in a loop until failure"
+ default y
+ help
+ Enable a loop wrapper for benchmark, http_client, and wolfssl test apps.
+
+ config ESP_WOLFSSL_EXPERIMENTAL_SETTINGS
+ bool "Enable wolfSSL Experimental Settings"
+ default n
+ help
+ Enables experimental settings for wolfSSL. See documentation.
+ endmenu # wolfSSL Debug Options
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "wolfSSL Customization"
+ config CUSTOM_SETTING_WOLFSSL_ROOT
+ string "Enter a path for wolfSSL source code"
+ default "~/workspace/wolfssl"
+ help
+ This option lets you specify a directory for the wolfSSL source code (typically a git clone).
+ Enter the path using forward slashes (e.g., C:/myfolder/mysubfolder) or double backslashes
+ (e.g., C:\\myfolder\\mysubfolder).
+
+ endmenu # wolfSSL Customization
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "Component Config"
+ config IGNORE_ESP_IDF_WOLFSSL_COMPONENT
+ bool "Ignore the ESP-IDF component of wolfSSL (if present)"
+ default n
+ help
+ Ignores wolfSSL present in the esp-idf/components directory. Requires wolfssl as a local component.
+
+ config IGNORE_LOCAL_WOLFSSL_COMPONENT
+ bool "Ignore the local component of wolfSSL (if present)"
+ default n
+ help
+ Ignores wolfSSL present in the local project components directory.
+ Requires wolfssl as a ESP-IDF component.
+
+ endmenu # Component Config
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "Utility Config"
+ config USE_WOLFSSL_ESP_SDK_TIME
+ bool "Enable wolfSSL time helper functions"
+ default n
+ help
+ Enables use of various time and date setting functions found in the esp-sdk-lib.h file.
+
+ config USE_WOLFSSL_ESP_SDK_WIFI
+ bool "Enable wolfSSL WiFi helper functions"
+ default n
+ help
+ Enables use of various time and date setting functions found in the esp-sdk-lib.h file.
+
+ endmenu # Utility Config
+endmenu # wolfSSL
+# ---------------------------------------------------------------------------------------------------------------------
+
+
+# ---------------------------------------------------------------------------------------------------------------------
+menu "wolfSSH"
+ config ESP_ENABLE_WOLFSSH
+ bool "Enable wolfSSH options"
+ default n
+ help
+ Enables WOLFSSH_TERM, WOLFSSL_KEY_GEN, WOLFSSL_PTHREADS, WOLFSSH_TEST_SERVER, WOLFSSH_TEST_THREADING
+
+ config ESP_WOLFSSL_DEBUG_WOLFSSH
+ bool "Enable wolfSSH debugging"
+ default n
+ help
+ Enable wolfSSH debugging macro. See user_settings.h
+
+endmenu # wolfSSH
+# ---------------------------------------------------------------------------------------------------------------------
+
+# ---------------------------------------------------------------------------------------------------------------------
+menu "wolfMQTT"
+ config ESP_ENABLE_WOLFMQTT
+ bool "Enable wolfMQTT options"
+ default n
+ help
+ Enables WOLFMQTT
+
+ config ESP_WOLFSSL_DEBUG_WOLFMQTT
+ bool "Enable wolfMQTT debugging"
+ default n
+ help
+ Enable wolfMQTT debugging macro. See user_settings.h
+
+endmenu # wolfMQTT
+# ---------------------------------------------------------------------------------------------------------------------
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/README.md b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/README.md
index 040c8c0b..d7791241 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/README.md
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/README.md
@@ -1,9 +1,162 @@
-# Component wolfSSL
-
-This `wolfssl` directory exists only for the stand-alone examples.
-
-The only files of interest are the [CMakeLists.txt](./CMakeLists.txt) that should point
-to the wolfSSL source code and the respective [include/user_settings.h](./include/user_settings.h).
-
-This directory is _not_ included in the publish to the Espressif Registry, as that
-mechanism copies the published source code to the local component directory as needed.
+# wolfSSL Espressif Component
+
+This is the directory for wolfSSL as an Espressif ESP-IDF component.
+
+Other options are available, such as installing wolfSSL as a local _project_ component using the [Managed Component](https://www.wolfssl.com/wolfssl-now-available-in-espressif-component-registry/).
+
+Enabling this wolfSSL ESP-IDF component allows other ESP-IDF libraries such as those that depend on [ESP-TLS](https://github.com/espressif/esp-idf/tree/master/components/esp-tls)
+to also use the wolfSSL library. (See [github.com/wolfSSL/wolfssl](https://github.com/wolfSSL/wolfssl))
+
+The wolfSSL source code is not included here. Instead, the `idf.py menuconfig` option can be used to configure the
+`sdkconfig` file setting: `CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT` to point to the desired wolfSSL code.
+
+## Directory Contents
+
+This directory must contain, at a minimum:
+
+- `CMakeLists.txt`
+- `./include/user_settings.h`
+
+The directory should also contain:
+- `Kconfig`
+- `component.mk`
+
+The directory may contain wolfSSL source, for example with a [Managed Component](https://www.wolfssl.com/wolfssl-now-available-in-espressif-component-registry/),
+or if the `setup.sh` script was used from [wolfSSL/IDE/Espressif/ESP-IDF](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF).
+
+
+Under normal circumstances when the wolfSSL source is not included here, the `CMakeLists.txt` will search for it in this order:
+
+- A hard-coded `WOLFSSL_ROOT` cmake variable.
+- `WOLFSSL_ROOT` Environment Variable
+- The `CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT` value in the `sdkconfig` file, from the `Kconfig` option.
+- Any parent directories, up to the root (if this directory is in the ESP-IDF components)
+- Any parent directories, up to the root (if this directory is a project component)
+
+While recursing up the directory tree, the following names of wolfSSL directories will be considered:
+
+- `wolfssl-[current user name]`
+- `wolfssl-master`
+- `wolfssl`
+
+## Getting Started
+
+See the `Espressif Getting Started Guide`.
+
+```
+# Set environment variable to ESP-IDF location
+# For example, VisualGDB in WSL
+WRK_IDF_PATH=/mnt/c/SysGCC/esp32/esp-idf/v5.2
+WRK_IDF_PATH=/mnt/c/SysGCC/esp32-master/esp-idf/v5.3-master
+
+# Or wherever the ESP-IDF is installed:
+WRK_IDF_PATH=~/esp/esp-idf
+
+echo "Run export.sh from ${WRK_IDF_PATH}"
+. ${WRK_IDF_PATH}/export.sh
+
+cd [your project]
+
+idf.py menuconfig
+```
+
+Enable wolfSSL to be used in the ESP-TLS:
+
+```
+Component config --->
+ ESP-TLS --->
+ Choose SSL/TLS library for ESP-TLS (See help for more Info)
+ (X) wolfSSL (License info in wolfSSL directory README)
+```
+
+Adjust wolfSSL settings, such as path to source code as needed:
+
+```
+Component config --->
+ wolfSSL --->
+ [*] Include wolfSSL in ESP-TLS
+ [*] Use the specified wolfssl for ESP-TLS
+ (~/workspace/wolfssl) Enter a path for wolfSSL source code
+```
+
+## Configuration
+
+All settings for wolfSSL are adjusted in the [include/user_settings.h](./include/user_settings.h) file.
+
+The `user_settings.h` file should not be included directly. Instead, `#include `
+before any other wolfSSL headers, like this:
+
+
+```c
+/* ESP-IDF */
+#include
+#include "sdkconfig.h"
+
+/* wolfSSL */
+/* Always include wolfcrypt/settings.h before any other wolfSSL file. */
+/* Reminder: settings.h pulls in user_settings.h; don't include it here. */
+#if defined(WOLFSSL_USER_SETTINGS)
+ #include
+ #if defined(WOLFSSL_ESPIDF)
+ #include
+ #include
+ #include
+ #include
+ #include
+ #else
+ #error "Problem with wolfSSL user_settings. " \
+ "Check components/wolfssl/include " \
+ "and confirm WOLFSSL_USER_SETTINGS is defined, " \
+ "typically in the component CMakeLists.txt"
+ #endif
+#else
+ /* Define WOLFSSL_USER_SETTINGS project wide for settings.h to include */
+ /* wolfSSL user settings in ./components/wolfssl/include/user_settings.h */
+ #error "Missing WOLFSSL_USER_SETTINGS in CMakeLists or Makefile:\
+ CFLAGS +=-DWOLFSSL_USER_SETTINGS"
+#endif
+```
+
+## Examples
+
+See the wolfSSL examples:
+
+- [wolfSSL Core Examples](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples)
+- [wolfSSL Additional Examples](https://github.com/wolfSSL/wolfssl-examples/tree/master/ESP32)
+- [wolfSSH Core Examples](https://github.com/wolfSSL/wolfssh/tree/master/ide/Espressif/ESP-IDF/examples)
+- [wolfSSH Additional Examples](https://github.com/wolfSSL/wolfssh-examples/tree/main/Espressif)
+- [wolfMQTT Examples](https://github.com/wolfSSL/wolfMQTT/tree/master/IDE/Espressif/ESP-IDF/examples)
+
+## Platforms
+
+The ESP-IDF wolfSSL is also available for PlatformIO:
+
+- [Release wolfSSL](https://registry.platformio.org/search?q=owner%3Awolfssl)
+- [Staging / Preview wolfSSL](https://registry.platformio.org/search?q=owner%3Awolfssl-staging)
+
+The wolfSSL library can also be used for Espressif with Arduino:
+
+- [arduino.cc/reference/en/libraries/wolfssl](https://www.arduino.cc/reference/en/libraries/wolfssl/)
+- [github.com/wolfSSL/Arduino-wolfSSL](https://github.com/wolfSSL/Arduino-wolfSSL)
+
+
+## Additional Information
+
+- [wolfSSL Documentation](https://www.wolfssl.com/documentation/manuals/wolfssl/index.html) and [docs/espressif](https://www.wolfssl.com/docs/espressif/)
+- [wolfSSL FAQ](https://www.wolfssl.com/docs/frequently-asked-questions-faq/)
+- [wolfSSL Products](https://www.wolfssl.com/products/)
+- [www.wolfssl.com/espressif](https://www.wolfssl.com/espressif/)
+- [More...](https://www.wolfssl.com/?s=espressif)
+
+## Contact
+
+Have a specific request or questions? We'd love to hear from you! Please contact us at support@wolfssl.com or open an issue on GitHub.
+
+## Licensing and Support
+
+wolfSSL (formerly known as CyaSSL) and wolfCrypt are either licensed for use under the GPLv2 (or at your option any later version) or a standard commercial license. For our users who cannot use wolfSSL under GPLv2 (or any later version), a commercial license to wolfSSL and wolfCrypt is available.
+
+See the LICENSE.txt, visit wolfssl.com/license, contact us at licensing@wolfssl.com or call +1 425 245 8247
+
+View Commercial Support Options: [wolfssl.com/products/support-and-maintenance](wolfssl.com/products/support-and-maintenance)
+
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/component.mk b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/component.mk
new file mode 100644
index 00000000..44904d6e
--- /dev/null
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/component.mk
@@ -0,0 +1,305 @@
+#
+# Copyright (C) 2014-2025 wolfSSL Inc.
+#
+# This file is part of wolfSSH.
+#
+# wolfSSH is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# wolfSSH is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with wolfSSH. If not, see .
+#
+
+$(info *********** wolfssl component ************)
+
+#
+# Component Makefile
+#
+#
+# The Espressif Managed Components are only for newer versions of the ESP-IDF
+# Typically only for ESP32[-x] targets and only for ESP-IDF v4.3 or later:
+# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html
+# https://components.espressif.com/
+#
+# Usage:
+#
+# make flash
+#
+# make flash ESPPORT=/dev/ttyS55
+#
+# make flash ESPBAUD=9600
+#
+# make monitor ESPPORT=COM1
+#
+# make monitor ESPPORT=/dev/ttyS55 MONITORBAUD=115200
+#
+# export ESPPORT=/dev/ttyS55
+#
+# https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html
+#
+
+# Although the project should define WOLFSSL_USER_SETTINGS, we'll also
+# define it here:
+CFLAGS +=-DWOLFSSL_USER_SETTINGS
+
+# Note that 4 source files created by autogen are excluded here.
+#
+# See these files commented out, below. Adjust as needed for your application:
+#
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/async.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/selftest.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o
+
+
+# NOTICE: the WOLFSSL_ROOT setting MUST be relative!
+# See https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-guides/build-system.html?highlight=must+relative#optional-component-specific-variables
+# In the wolfSSL GitHub examples for Espressif:
+# https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples
+# When this wolfssl component.mk makefile is in [project]/components/wolfssl
+# The root is 7 directories up from here (the location of of this component.mk):
+#
+WOLFSSL_ROOT ?= ../../../../../../..
+THIS_DIR := $(shell pwd)
+WOLFSSL_ROOT_OBJ := $(THIS_DIR)
+
+# When running make from commandline or VisualGDB, the current path varies:
+ifeq ("$(VISUALGDB_DIR)","")
+ # current path is typically /mnt/c/workspace/wolfssl-gojimmypi/IDE/Espressif/ESP-IDF/examples/wolfssl_test/build/wolfssl
+ $(info VISUALGDB_DIR build not detected. shell: $(shell echo $$SHELL))
+else
+ # current path is typically /C/workspace/wolfssl-gojimmypi/IDE/Espressif/ESP-IDF/examples/wolfssl_test/build/Debug/wolfssl
+ $(info Detected VisualGDB in: $(VISUALGDB_DIR) shell: $(shell echo $$SHELL))
+endif
+
+# To set the location of a different location, it is best to use relative paths.
+#
+# Set WOLFSSL_ROOT to a relative path from the current component directory.
+# For example, if the wolfssl_client is copied from the examples to test:
+#
+# cp -r /IDE/Espressif/ESP-IDF/examples/wolfssl_client/* /mnt/c/test/demo
+#
+# we run make in /mnt/c/test/demo
+# component is in /mnt/c/test/demo/components/wolfssl
+# wolfssl is in /mnt/c/workspace/wolfssl-master
+#
+# "/mnt/c" is 4 directories up:
+# 2 for `./test/demo` from where we run `make`, plus
+# 2 more from the location of `component.mk` located
+# in `[current directory]/components/wolfssl`.
+#
+# Thus we need 4 parent reference to find the relative path to wolfSSL:
+# WOLFSSL_ROOT := ../../../../workspace/wolfssl-master
+
+# Optional CFLAGS (make works without these; for reference only)
+# CFLAGS += -I$(WOLFSSL_ROOT)/wolfssl
+# CFLAGS += -I$(WOLFSSL_ROOT)/wolfssl/wolfcrypt
+# CFLAGS += -I$(WOLFSSL_ROOT)/wolfssl/wolfcrypt/port/Espressif
+
+abs_WOLFSSL_ROOT := $(shell realpath $(WOLFSSL_ROOT))
+
+# print-wolfssl-path-value:
+# @echo "WOLFSSL_ROOT defined: $(WOLFSSL_ROOT)"
+# @echo "WOLFSSL_ROOT actual: $(abs_WOLFSSL_ROOT)"
+
+$(info WOLFSSL_ROOT defined: $(WOLFSSL_ROOT))
+$(info WOLFSSL_ROOT actual: $(abs_WOLFSSL_ROOT))
+$(info THIS_DIR defined: $(THIS_DIR))
+$(info WOLFSSL_ROOT_OBJ defined: $(WOLFSSL_ROOT_OBJ))
+
+# NOTE: The wolfSSL include directory (e.g. user_settings.h) is
+# located HERE in THIS project, and *not* in the wolfSSL root.
+COMPONENT_ADD_INCLUDEDIRS := .
+COMPONENT_ADD_INCLUDEDIRS += include
+COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/.
+COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl
+COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl/wolfcrypt
+COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl/wolfcrypt/port/Espressif
+
+# COMPONENT_ADD_INCLUDEDIRS += $ENV(IDF_PATH)/components/freertos/include/freertos
+# COMPONENT_ADD_INCLUDEDIRS += "$ENV(IDF_PATH)/soc/esp32s3/include/soc"
+
+# wolfSSL
+COMPONENT_SRCDIRS := $(WOLFSSL_ROOT)/src
+
+# wolfcrypt
+COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src
+
+# Espressif
+COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif
+COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/atmel
+
+COMPONENT_OBJEXCLUDE := $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/aes_asm.o
+COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/evp.o
+COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/misc.o
+COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/sha512_asm.o
+COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/fe_x25519_asm.o
+COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/aes_gcm_x86_asm.o
+
+##
+## wolfSSL
+##
+## reminder object files may end up in `./build` or `build/debug` or `build/release`, depending on build environment & settings.
+##
+# COMPONENT_OBJS := $(WOLFSSL_ROOT)/src/bio.o # part of ssl.c, omitted to avoid "does not need to be compiled separately"
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/conf.o # part of ssl.c
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/crl.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/dtls.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/dtls13.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/internal.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/keys.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/ocsp.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/pk.o # part of ssl.c
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/quic.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/sniffer.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/ssl.o
+# COMPONENT_OBJS += src/ssl_asn1.o
+# COMPONENT_OBJS += src/ssl_bn.o
+# COMPONENT_OBJS += src/ssl_certman.o
+# COMPONENT_OBJS += src/ssl_crypto.o
+# COMPONENT_OBJS += src/ssl_misc.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/tls.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/tls13.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/wolfio.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/x509.o # part of ssl.c
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/x509_str.o # part of ssl.c
+
+##
+## wolfcrypt
+##
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/aes.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/arc4.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/asm.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/asn.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/async.o # autogen exclusion
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/blake2b.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/blake2s.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/camellia.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/chacha.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/chacha20_poly1305.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cmac.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/coding.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/compress.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cpuid.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cryptocb.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/curve25519.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/curve448.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/des3.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dh.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dilithium.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dsa.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ecc.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/eccsi.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ecc_fp.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed25519.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed448.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/error.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_mlkem.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_lms.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_xmss.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/falcon.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_448.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_low_mem.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_operations.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fips.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fips_test.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_448.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_low_mem.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_operations.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hash.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hmac.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hpke.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/integer.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/kdf.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/logging.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md2.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md4.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md5.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/memory.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/misc.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pkcs12.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pkcs7.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/poly1305.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pwdbased.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/random.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/rc2.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ripemd.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/rsa.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sakke.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/selftest.o # autogen exclusion
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha256.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha3.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha512.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/signature.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/siphash.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm2.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm3.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm4.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sphincs.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm32.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm64.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_armthumb.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c32.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c64.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_cortexm.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_dsp32.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_int.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_arm32.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_arm64.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_armthumb.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_c32.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_c64.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_cortexm.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_x86_64.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_x86_64.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/srp.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/tfm.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_dsp.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_encrypt.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_mlkem.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_mlkem_poly.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_lms.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_pkcs11.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_port.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_xmss.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o # autogen exclusion
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o # autogen exclusion
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfevent.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfmath.o
+
+##
+## Espressif
+##
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_aes.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_mp.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_sha.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_util.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_time_lib.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.o
+
+##
+## wolfcrypt benchmark (optional)
+##
+## COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark/benchmark.o
+## COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark
+## COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark
+
+
+##
+## wolfcrypt test (optional)
+##
+## COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/test/test.o
+## COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/test
+## COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfcrypt/test/include
+
+$(info ********** end wolfssl component **********)
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/include/user_settings.h b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/include/user_settings.h
index 6d0e197e..0e94e39a 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/include/user_settings.h
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/components/wolfssl/include/user_settings.h
@@ -1,6 +1,6 @@
-/* user_settings.h
+/* wolfssl-component include/user_settings.h
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
@@ -17,20 +17,61 @@
* You should have received a copy of the GNU General Public License
* along with wolfSSH. If not, see .
*/
+#define WOLFSSL_ESPIDF_COMPONENT_VERSION 0x01
-#include /* essential to chip set detection */
+/* Examples such as test and benchmark are known to cause watchdog timeouts.
+ * Note this is often set in project Makefile:
+ * CFLAGS += -DWOLFSSL_ESP_NO_WATCHDOG=1 */
+#define WOLFSSL_ESP_NO_WATCHDOG 1
-#undef WOLFSSL_ESPIDF
-#undef WOLFSSL_ESP32
-#undef WOLFSSL_ESPWROOM32SE
-#undef WOLFSSL_ESP32
-#undef WOLFSSL_ESP8266
+/* The Espressif project config file. See also sdkconfig.defaults */
+#include "sdkconfig.h"
-#define WOLFSSL_ESPIDF
+/* This user_settings.h is for Espressif ESP-IDF
+ *
+ * Standardized wolfSSL Espressif ESP32 + ESP8266 user_settings.h V5.7.0-1
+ *
+ * Do not include any wolfssl headers here.
+ *
+ * When editing this file:
+ * ensure all examples match. The template example is the reference.
+ */
+
+/* Naming convention: (see also esp32-crypt.h for the reference source).
+ *
+ * CONFIG_
+ * This prefix indicates the setting came from the sdkconfig / Kconfig.
+ *
+ * May or may not be related to wolfSSL.
+ *
+ * The name after this prefix must exactly match that in the Kconfig file.
+ *
+ * WOLFSSL_
+ * Typical of many, but not all wolfSSL macro names.
+ *
+ * Applies to all wolfSSL products such as wolfSSH, wolfMQTT, etc.
+ *
+ * May or may not have a corresponding sdkconfig / Kconfig control.
+ *
+ * ESP_WOLFSSL_
+ * These are NOT valid wolfSSL macro names. These are names only used in
+ * the ESP-IDF Kconfig files. When parsed, they will have a "CONFIG_"
+ * suffix added. See next section.
+ *
+ * CONFIG_ESP_WOLFSSL_
+ * This is a wolfSSL-specific macro that has been defined in the ESP-IDF
+ * via the sdkconfig / menuconfig. Any text after this prefix should
+ * exactly match an existing wolfSSL macro name.
+ *
+ * Applies to all wolfSSL products such as wolfSSH, wolfMQTT, etc.
+ *
+ * These macros may also be specific to only the project or environment,
+ * and possibly not used anywhere else in the wolfSSL libraries.
+ */
/* The Espressif sdkconfig will have chipset info.
**
-** Possible values:
+** Some possible values:
**
** CONFIG_IDF_TARGET_ESP32
** CONFIG_IDF_TARGET_ESP32S2
@@ -39,17 +80,251 @@
** CONFIG_IDF_TARGET_ESP32C6
*/
+#undef WOLFSSL_ESPIDF
+#define WOLFSSL_ESPIDF
+
+/* Test various user_settings between applications by selecting example apps
+ * in `idf.py menuconfig` for Example wolfSSL Configuration settings: */
+
+/* Turn on messages that are useful to see only in examples. */
+#define WOLFSSL_EXAMPLE_VERBOSITY
+
+/* Paths can be long, ensure the entire value printed during debug */
+#define WOLFSSL_MAX_ERROR_SZ 500
+
+/* wolfSSL Examples: set macros used in example applications.
+ *
+ * These Settings NOT available in ESP-IDF (e.g. esp-tls)
+ *
+ * Any settings needed by ESP-IDF components should be explicitly set,
+ * and not by these example-specific settings via CONFIG_WOLFSSL_EXAMPLE_n
+ *
+ * ESP-IDF settings should be Kconfig "CONFIG_[name]" values when possible. */
+#if defined(CONFIG_WOLFSSL_EXAMPLE_NAME_TEMPLATE)
+ /* See https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/template */
+ /* We don't use WiFi, so don't compile in the esp-sdk-lib WiFi helpers: */
+ /* #define USE_WOLFSSL_ESP_SDK_WIFI */
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_TEST)
+ /* See https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/wolfssl_test */
+ /* We don't use WiFi, so don't compile in the esp-sdk-lib WiFi helpers: */
+ /* #define USE_WOLFSSL_ESP_SDK_WIFI */
+ #define TEST_ESPIDF_ALL_WOLFSSL
+ #define HAVE_HKDF
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_BENCHMARK)
+ /* See https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark */
+ /* We don't use WiFi, so don't compile in the esp-sdk-lib WiFi helpers: */
+ /* #define USE_WOLFSSL_ESP_SDK_WIFI */
+ #define WOLFSSL_BENCHMARK_FIXED_UNITS_KB
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_TLS_CLIENT)
+ /* See https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/wolfssl_client */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_TLS_SERVER)
+ /* See https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/wolfssl_server */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+
+/* wolfSSH Examples */
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_WOLFSSH_TEMPLATE)
+ /* See https://github.com/wolfSSL/wolfssh/tree/master/ide/Espressif/ESP-IDF/examples/wolfssh_template */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_WOLFSSH_ECHOSERVER)
+ /* See https://github.com/wolfSSL/wolfssh/tree/master/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_ESP32_SSH_SERVER)
+ /* See https://github.com/wolfSSL/wolfssh-examples/tree/main/Espressif/ESP32/ESP32-SSH-Server */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_ESP8266_SSH_SERVER)
+ /* See https://github.com/wolfSSL/wolfssh-examples/tree/main/Espressif/ESP8266/ESP8266-SSH-Server */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+
+/* wolfMQTT Examples */
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_WOLFMQTT_TEMPLATE)
+ /* See https://github.com/wolfSSL/wolfMQTT/tree/master/IDE/Espressif/ESP-IDF/examples/wolfmqtt_template */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_WOLFMQTT_AWS_IOT_MQTT)
+ /* See https://github.com/wolfSSL/wolfMQTT/tree/master/IDE/Espressif/ESP-IDF/examples/AWS_IoT_MQTT */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+
+/* wolfTPM Examples */
+#elif defined(CONFIG_WOLFTPM_EXAMPLE_NAME_ESPRESSIF)
+ /* See https://github.com/wolfSSL/wolfTPM/tree/master/IDE/Espressif */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+
+/* Apple HomeKit Examples */
+#elif defined(CONFIG_WOLFSSL_APPLE_HOMEKIT)
+ /* See https://github.com/AchimPieters/esp32-homekit-demo */
+
+/* no example selected */
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_NONE)
+ /* We'll assume the app needs to use wolfSSL sdk lib function */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+
+/* Other applications detected by cmake */
+#elif defined(APP_ESP_HTTP_CLIENT_EXAMPLE)
+ /* The wolfSSL Version of the client example */
+ #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C2)
+ /* Less memory available, so smaller key sizes: */
+ #define FP_MAX_BITS (4096 * 2)
+ #else
+ #define FP_MAX_BITS (8192 * 2)
+ #endif
+ #define HAVE_ALPN
+ #define HAVE_SNI
+ #define OPENSSL_EXTRA_X509_SMALL
+ #define HAVE_TLS_EXTENSIONS
+ #define HAVE_SUPPORTED_CURVES
+ #define OPENSSL_EXTRA
+ #ifndef WOLFSSL_ALWAYS_VERIFY_CB
+ #define WOLFSSL_ALWAYS_VERIFY_CB
+ #endif
+ #ifndef WOLFSSL_VERIFY_CB_ALL_CERTS
+ #define WOLFSSL_VERIFY_CB_ALL_CERTS
+ #endif
+ #ifndef KEEP_PEER_CERT
+ #define KEEP_PEER_CERT
+ #endif
+
+#elif defined(APP_ESP_HTTP_CLIENT)
+ /* The ESP-IDF Version */
+ #define FP_MAX_BITS (8192 * 2)
+ #define HAVE_ALPN
+ #define HAVE_SNI
+ #define OPENSSL_EXTRA_X509_SMALL
+ #define HAVE_TLS_EXTENSIONS
+ #define HAVE_SUPPORTED_CURVES
+ #define OPENSSL_EXTRA
+ #ifndef WOLFSSL_ALWAYS_VERIFY_CB
+ #define WOLFSSL_ALWAYS_VERIFY_CB
+ #endif
+ #ifndef WOLFSSL_VERIFY_CB_ALL_CERTS
+ #define WOLFSSL_VERIFY_CB_ALL_CERTS
+ #endif
+ #ifndef KEEP_PEER_CERT
+ #define KEEP_PEER_CERT
+ #endif
+#else
+ #ifdef WOLFSSL_ESPIDF
+ /* #warning "App config undetected" */
+ #endif
+ /* the code is older or does not have application name defined. */
+#endif /* Example wolfSSL Configuration app settings */
+
+/* Optional MLKEM (Kyber Post Quantum) */
+/* ./configure --enable-mlkem */
+/* See Kconfig / menuconfig ESP_WOLFSSL_ENABLE_MLKEM */
+#ifdef CONFIG_ESP_WOLFSSL_ENABLE_MLKEM
+ /* Kyber typically needs a minimum 10K stack */
+ #define WOLFSSL_HAVE_MLKEM
+ #define WOLFSSL_WC_MLKEM
+ #define WOLFSSL_SHAKE128
+ #define WOLFSSL_SHAKE256
+
+ /* Old code points to keep compatibility with Kyber Round 3. */
+ /* ./configure --enable-kyber=all --enable-experimental */
+ #if defined(CONFIG_WOLFSSL_ENABLE_KYBER)
+ #define WOLFSSL_MLKEM_KYBER
+ #define WOLFSSL_EXPERIMENTAL_SETTINGS
+ #endif
+
+ #if defined(CONFIG_IDF_TARGET_ESP8266)
+ /* With limited RAM, we'll disable some of the Kyber sizes: */
+ #define WOLFSSL_NO_KYBER1024
+ #define WOLFSSL_NO_KYBER768
+ #define WOLFSSL_NO_ML_KEM_1024
+ #define WOLFSSL_NO_ML_KEM_768
+ #define NO_SESSION_CACHE
+ #else
+ /* Only needed for older wolfssl versions, see mlkem.h */
+ #define WOLFSSL_KYBER1024
+ /* optional alternative sizes: */
+ /* #define WOLFSSL_KYBER768 */
+ /* #define WOLFSSL_KYBER512 */
+ /* -- or disable a specific one: */
+ /* #define WOLFSSL_NO_ML_KEM_1024 */
+ /* #define WOLFSSL_NO_ML_KEM_768 */
+ /* #define WOLFSSL_NO_ML_KEM_512 */
+ #endif
+#endif
+
+/* Enable AES for all examples */
+#ifdef NO_AES
+ #warning "Found NO_AES, wolfSSL AES Cannot be enabled. Check config."
+#else
+ #define WOLFSSL_AES
+ #define WOLFSSL_AES_COUNTER
+
+ /* Typically only needed for wolfssl_test, see docs. */
+ #define WOLFSSL_AES_DIRECT
+#endif
+
+/* Pick a cert buffer size: */
+/* #define USE_CERT_BUFFERS_2048 */
+/* #define USE_CERT_BUFFERS_1024 */
+#define USE_CERT_BUFFERS_2048
+
+/* The Espressif sdkconfig will have chipset info.
+**
+** Some possible values:
+**
+** CONFIG_IDF_TARGET_ESP32
+** CONFIG_IDF_TARGET_ESP32S2
+** CONFIG_IDF_TARGET_ESP32S3
+** CONFIG_IDF_TARGET_ESP32C3
+** CONFIG_IDF_TARGET_ESP32C6
+*/
+
+/* Optionally enable Apple HomeKit from compiler directive or Kconfig setting */
+#if defined(WOLFSSL_APPLE_HOMEKIT) || defined(CONFIG_WOLFSSL_APPLE_HOMEKIT)
+ /* SRP is known to need 8K; slow on some devices */
+ #define FP_MAX_BITS (8192 * 2)
+ #define WOLFCRYPT_HAVE_SRP
+ #define HAVE_CHACHA
+ #define HAVE_POLY1305
+ #define WOLFSSL_BASE64_ENCODE
+ #endif /* Apple HomeKit settings */
+
+/* Used by ESP-IDF components: */
+#if defined(CONFIG_ESP_TLS_USING_WOLFSSL)
+ /* The ESP-TLS */
+ #ifndef FP_MAX_BITS
+ #if defined(CONFIG_IDF_TARGET_ESP32C2) || \
+ defined(CONFIG_IDF_TARGET_ESP8684) || \
+ defined(CONFIG_IDF_TARGET_ESP8266)
+ /* Optionally set smaller size here */
+ #define FP_MAX_BITS MIN_FFDHE_FP_MAX_BITS
+ #else
+ #define FP_MAX_BITS (4096 * 2)
+ #endif
+ #endif
+ #define HAVE_ALPN
+ #ifndef CONFIG_IDF_TARGET_ESP8266
+ /* Unless installed in the ESP8266 RTOS SDK locally, the wolfSSL
+ * API for SNI will not be seen in the components/esp-tls layer.
+ * Only enable SNI for non-ESP8266 targets by default: */
+ #define HAVE_SNI
+ #endif
+ #define OPENSSL_EXTRA_X509_SMALL
+
+ #define HAVE_TLS_EXTENSIONS
+ #define HAVE_SUPPORTED_CURVES
+#endif
+
/* Optionally enable some wolfSSH settings */
-#ifdef ESP_ENABLE_WOLFSSH
- /* The default SSH Windows size is massive for an embedded target. Limit it: */
+#if defined(ESP_ENABLE_WOLFSSH) || defined(CONFIG_ESP_ENABLE_WOLFSSH)
+ /* Enable wolfSSH. Espressif examples need a few more settings, below */
+ #undef WOLFSSL_WOLFSSH
+ #define WOLFSSL_WOLFSSH
+
+ /* The default SSH Windows size is massive for an embedded target.
+ * Limit it: */
#define DEFAULT_WINDOW_SZ 2000
/* These may be defined in cmake for other examples: */
#undef WOLFSSH_TERM
#define WOLFSSH_TERM
- #undef DEBUG_WOLFSSH
- #define DEBUG_WOLFSSH
+ /* optional debug */
+ /* #undef DEBUG_WOLFSSH */
+ /* #define DEBUG_WOLFSSH */
#undef WOLFSSL_KEY_GEN
#define WOLFSSL_KEY_GEN
@@ -59,21 +334,54 @@
#define WOLFSSH_TEST_SERVER
#define WOLFSSH_TEST_THREADING
-
#endif /* ESP_ENABLE_WOLFSSH */
-/* when you want to use SINGLE THREAD */
-/* #define SINGLE_THREADED */
+
+/* Not yet using WiFi lib, so don't compile in the esp-sdk-lib WiFi helpers: */
+/* #define USE_WOLFSSL_ESP_SDK_WIFI */
/*
- * choose ONE of these Espressif chips to define:
+ * ONE of these Espressif chip families will be detected from sdkconfig:
*
* WOLFSSL_ESP32
* WOLFSSL_ESPWROOM32SE
* WOLFSSL_ESP8266
+ *
+ * following ifdef detection only for syntax highlighting:
*/
+#ifdef WOLFSSL_ESPWROOM32SE
+ #undef WOLFSSL_ESPWROOM32SE
+#endif
+#ifdef WOLFSSL_ESP8266
+ #undef WOLFSSL_ESP8266
+#endif
+#ifdef WOLFSSL_ESP32
+ #undef WOLFSSL_ESP32
+#endif
+/* See below for chipset detection from sdkconfig.h */
-#define WOLFSSL_ESP32
+/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */
+#define SINGLE_THREADED
+
+/* Small session cache saves a lot of RAM for ClientCache and SessionCache.
+ * Memory requirement is about 5KB, otherwise 20K is needed when not specified.
+ * If extra small footprint is needed, try MICRO_SESSION_CACHE (< 1K)
+ * When really desperate or no TLS used, try NO_SESSION_CACHE. */
+#define NO_SESSION_CACHE
+
+/* Small Stack uses more heap. */
+#define WOLFSSL_SMALL_STACK
+
+/* Full debugging turned off, but show malloc failure detail */
+/* #define DEBUG_WOLFSSL */
+#define DEBUG_WOLFSSL_MALLOC
+
+/* See test.c that sets cert buffers; we'll set them here: */
+#define USE_CERT_BUFFERS_256
+#define USE_CERT_BUFFERS_2048
+
+/* RSA_LOW_MEM: Half as much memory but twice as slow. */
+#define RSA_LOW_MEM
/* optionally turn off SHA512/224 SHA512/256 */
/* #define WOLFSSL_NOSHA512_224 */
@@ -87,37 +395,84 @@
/* #define NO_OLD_TLS */
#define BENCH_EMBEDDED
-#define USE_CERT_BUFFERS_2048
-#define NO_OLD_TLS
-/* TLS 1.3
- #define WOLFSSL_TLS13
- #define HAVE_TLS_EXTENSIONS
- #define WC_RSA_PSS
- #define HAVE_SUPPORTED_CURVES
-*/
+/* TLS 1.3 */
+#ifdef CONFIG_WOLFSSL_ALLOW_TLS13
+ #define WOLFSSL_TLS13
+ #define HAVE_TLS_EXTENSIONS
+ #define HAVE_HKDF
-#define HAVE_HKDF
-#define HAVE_AEAD
+ /* May be required */
+ #ifndef HAVE_AEAD
+ #endif
+
+ /* Required for ECC */
+ #define HAVE_SUPPORTED_CURVES
+
+ /* Required for RSA */
+ #define WC_RSA_PSS
+
+ /* TLS 1.3 normally requires HAVE_FFDHE */
+ #if defined(HAVE_FFDHE_2048) || \
+ defined(HAVE_FFDHE_3072) || \
+ defined(HAVE_FFDHE_4096) || \
+ defined(HAVE_FFDHE_6144) || \
+ defined(HAVE_FFDHE_8192)
+ #else
+ #define HAVE_FFDHE_2048
+ /* #error "TLS 1.3 requires HAVE_FFDHE_[nnnn]" */
+ #endif
+#endif
+
+#if defined(CONFIG_IDF_TARGET_ESP32C2) || \
+ defined(CONFIG_IDF_TARGET_ESP8684)
+ /* Optionally set smaller size here */
+ #ifdef HAVE_FFDHE_4096
+ /* this size may be problematic on the C2 */
+ #endif
+ #define HAVE_FFDHE_2048
+#else
+ #define HAVE_FFDHE_4096
+#endif
#define NO_FILESYSTEM
+#define NO_OLD_TLS
+
#define HAVE_AESGCM
-#define WOLFSSL_RIPEMD
-/* when you want to use SHA224 */
-/* #define WOLFSSL_SHA224 */
+/* Optional RIPEMD: RACE Integrity Primitives Evaluation Message Digest */
+/* #define WOLFSSL_RIPEMD */
+/* when you want to use SHA224 */
+#define WOLFSSL_SHA224
/* when you want to use SHA384 */
-/* #define WOLFSSL_SHA384 */
+#define WOLFSSL_SHA384
-/* #define WOLFSSL_SHA3 */
+/* Some features not enabled for ESP8266: */
+#if defined(CONFIG_IDF_TARGET_ESP8266) || \
+ defined(CONFIG_IDF_TARGET_ESP32C2)
+ /* Some known low-memory devices have features not enabled by default. */
+ /* TODO determine low memory configuration for ECC. */
+#else
+ /* when you want to use SHA512 */
+ #define WOLFSSL_SHA512
-#define WOLFSSL_SHA512
+ /* when you want to use SHA3 */
+ /* #define WOLFSSL_SHA3 */
-#define MY_USE_ECC 1
-#define MY_USE_RSA 0
+ /* ED25519 requires SHA512 */
+ #define HAVE_ED25519
+#endif
+
+#if defined(CONFIG_IDF_TARGET_ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C2)
+ #define MY_USE_ECC 0
+ #define MY_USE_RSA 1
+#else
+ #define MY_USE_ECC 1
+ #define MY_USE_RSA 0
+#endif
/* We can use either or both ECC and RSA, but must use at least one. */
#if MY_USE_ECC || MY_USE_RSA
@@ -126,7 +481,7 @@
#define HAVE_ECC
#define HAVE_CURVE25519
#define HAVE_ED25519
-
+ #define WOLFSSL_SHA512
/*
#define HAVE_ECC384
#define CURVE25519_SMALL
@@ -151,24 +506,42 @@
#error "Either RSA or ECC must be enabled"
#endif
+/* Optional OpenSSL compatibility */
+/* #define OPENSSL_EXTRA */
-/* when you want to use pkcs7 */
+/* #Optional HAVE_PKCS7 */
/* #define HAVE_PKCS7 */
#if defined(HAVE_PKCS7)
+ /* HAVE_PKCS7 may enable HAVE_PBKDF2 see settings.h */
+ #define NO_PBKDF2
+
#define HAVE_AES_KEYWRAP
#define HAVE_X963_KDF
#define WOLFSSL_AES_DIRECT
#endif
-/* when you want to use aes counter mode */
+/* when you want to use AES counter mode */
/* #define WOLFSSL_AES_DIRECT */
/* #define WOLFSSL_AES_COUNTER */
-/* debug options */
-/* #define DEBUG_WOLFSSL */
-/* #define WOLFSSL_ESP32_CRYPT_DEBUG */
-/* #define WOLFSSL_ATECC508A_DEBUG */
+/* esp32-wroom-32se specific definition */
+#if defined(WOLFSSL_ESPWROOM32SE)
+ #define WOLFSSL_ATECC508A
+ #define HAVE_PK_CALLBACKS
+ /* when you want to use a custom slot allocation for ATECC608A */
+ /* unless your configuration is unusual, you can use default */
+ /* implementation. */
+ /* #define CUSTOM_SLOT_ALLOCATION */
+#endif
+
+/* WC_NO_CACHE_RESISTANT: slower but more secure */
+/* #define WC_NO_CACHE_RESISTANT */
+
+/* TFM_TIMING_RESISTANT: slower but more secure */
+/* #define TFM_TIMING_RESISTANT */
+
+/* #define WOLFSSL_ATECC508A_DEBUG */
/* date/time */
/* if it cannot adjust time in the device, */
@@ -176,15 +549,21 @@
/* #define NO_ASN_TIME */
/* #define XTIME time */
-/* adjust wait-timeout count if you see timeout in RSA HW acceleration */
-#define ESP_RSA_TIMEOUT_CNT 0x249F00
+/* Adjust wait-timeout count if you see timeout in RSA HW acceleration.
+ * Set to very large number and enable WOLFSSL_HW_METRICS to determine max. */
+#ifndef ESP_RSA_TIMEOUT_CNT
+ #define ESP_RSA_TIMEOUT_CNT 0xFF0000
+#endif
+
+/* hash limit for test.c */
+#define HASH_SIZE_LIMIT
/* USE_FAST_MATH is default */
#define USE_FAST_MATH
/***** Use SP_MATH *****/
-/* #undef USE_FAST_MATH */
+/* #undef USE_FAST_MATH */
/* #define SP_MATH */
/* #define WOLFSSL_SP_MATH_ALL */
/* #define WOLFSSL_SP_RISCV32 */
@@ -193,11 +572,63 @@
/* #undef USE_FAST_MATH */
/* #define USE_INTEGER_HEAP_MATH */
+/* Just syntax highlighting to check math libraries: */
+#if defined(SP_MATH) || \
+ defined(USE_INTEGER_HEAP_MATH) || \
+ defined(USE_INTEGER_HEAP_MATH) || \
+ defined(USE_FAST_MATH) || \
+ defined(WOLFSSL_SP_MATH_ALL) || \
+ defined(WOLFSSL_SP_RISCV32)
+#endif
-#define WOLFSSL_SMALL_STACK
-/* The ESP32 has some detailed statup information available:*/
#define HAVE_VERSION_EXTENDED_INFO
+/* #define HAVE_WC_INTROSPECTION */
+
+#ifndef NO_SESSION_CACHE
+ #define HAVE_SESSION_TICKET
+#endif
+
+/* #define HAVE_HASHDRBG */
+
+#if 0
+/* Example for additional cert functions */
+#define WOLFSSL_KEY_GEN
+ #define WOLFSSL_CERT_REQ
+ #define WOLFSSL_CERT_GEN
+ #define WOLFSSL_CERT_EXT
+ #define WOLFSSL_SYS_CA_CERTS
+
+
+ #define WOLFSSL_CERT_TEXT
+
+ /* command-line options
+ --enable-keygen
+ --enable-certgen
+ --enable-certreq
+ --enable-certext
+ --enable-asn-template
+ */
+
+#endif
+
+#define WOLFSSL_ASN_TEMPLATE
+
+/*
+#undef WOLFSSL_KEY_GEN
+#undef WOLFSSL_CERT_REQ
+#undef WOLFSSL_CERT_GEN
+#undef WOLFSSL_CERT_EXT
+#undef WOLFSSL_SYS_CA_CERTS
+*/
+
+/* command-line options
+--enable-keygen
+--enable-certgen
+--enable-certreq
+--enable-certext
+--enable-asn-template
+*/
/* optional SM4 Ciphers. See https://github.com/wolfSSL/wolfsm */
/*
@@ -251,20 +682,14 @@
#define USE_CERT_BUFFERS_2048
#endif
-/* esp32-wroom-32se specific definition */
-#if defined(WOLFSSL_ESPWROOM32SE)
- #define WOLFSSL_ATECC508A
- #define HAVE_PK_CALLBACKS
- /* when you want to use a custom slot allocation for ATECC608A */
- /* unless your configuration is unusual, you can use default */
- /* implementation. */
- /* #define CUSTOM_SLOT_ALLOCATION */
-#endif
-
-/* Default is HW enabled unless turned off.
-** Uncomment these lines to force SW instead of HW acceleration */
-
+/* Chipset detection from sdkconfig.h
+ * Default is HW enabled unless turned off.
+ * Uncomment lines to force SW instead of HW acceleration */
#if defined(CONFIG_IDF_TARGET_ESP32) || defined(WOLFSSL_ESPWROOM32SE)
+ #define WOLFSSL_ESP32
+ /* Alternatively, if there's an ECC Secure Element present: */
+ /* #define WOLFSSL_ESPWROOM32SE */
+
/* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */
/* #define NO_ESP32_CRYPT */
/* #define NO_WOLFSSL_ESP32_CRYPT_HASH */
@@ -275,23 +700,14 @@
/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */
/* These are defined automatically in esp32-crypt.h, here for clarity: */
- /* no SHA224 HW on ESP32 */
- #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224
+ #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 /* no SHA224 HW on ESP32 */
- /* Define USE_FAST_MATH and SMALL_STACK */
- #define ESP32_USE_RSA_PRIMITIVE
-
- /* threshold for performance adjustment for HW primitive use */
- /* X bits of G^X mod P greater than */
- #define EPS_RSA_EXPT_XBTIS 32
-
- /* X and Y of X * Y mod P greater than */
#undef ESP_RSA_MULM_BITS
- #define ESP_RSA_MULM_BITS 16
-
+ #define ESP_RSA_MULM_BITS 16 /* TODO add compile-time warning */
/***** END CONFIG_IDF_TARGET_ESP32 *****/
#elif defined(CONFIG_IDF_TARGET_ESP32S2)
+ #define WOLFSSL_ESP32
/* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */
/* #define NO_ESP32_CRYPT */
/* #define NO_WOLFSSL_ESP32_CRYPT_HASH */
@@ -304,6 +720,7 @@
/***** END CONFIG_IDF_TARGET_ESP32S2 *****/
#elif defined(CONFIG_IDF_TARGET_ESP32S3)
+ #define WOLFSSL_ESP32
/* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */
/* #define NO_ESP32_CRYPT */
/* #define NO_WOLFSSL_ESP32_CRYPT_HASH */
@@ -317,6 +734,7 @@
#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \
defined(CONFIG_IDF_TARGET_ESP8684)
+ #define WOLFSSL_ESP32
/* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a
* single QFN 4x4 mm package. Out of released documentation, Technical
* Reference Manual as well as ESP-IDF Programming Guide is applicable
@@ -342,6 +760,7 @@
/***** END CONFIG_IDF_TARGET_ESP32C2 *****/
#elif defined(CONFIG_IDF_TARGET_ESP32C3)
+ #define WOLFSSL_ESP32
/* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */
/* #define NO_ESP32_CRYPT */
@@ -359,6 +778,7 @@
/***** END CONFIG_IDF_TARGET_ESP32C3 *****/
#elif defined(CONFIG_IDF_TARGET_ESP32C6)
+ #define WOLFSSL_ESP32
/* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */
/* #define NO_ESP32_CRYPT */
@@ -375,6 +795,7 @@
/***** END CONFIG_IDF_TARGET_ESP32C6 *****/
#elif defined(CONFIG_IDF_TARGET_ESP32H2)
+ #define WOLFSSL_ESP32
/* wolfSSL Hardware Acceleration not yet implemented */
#define NO_ESP32_CRYPT
#define NO_WOLFSSL_ESP32_CRYPT_HASH
@@ -382,12 +803,29 @@
#define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI
/***** END CONFIG_IDF_TARGET_ESP32H2 *****/
-#elif defined(CONFIG_IDF_TARGET_ESP8266)
- /* TODO: Revisit ESP8266 */
+#elif defined(CONFIG_IDF_TARGET_ESP32P4)
+ #define WOLFSSL_ESP32
+ /* wolfSSL Hardware Acceleration not yet implemented */
#define NO_ESP32_CRYPT
#define NO_WOLFSSL_ESP32_CRYPT_HASH
#define NO_WOLFSSL_ESP32_CRYPT_AES
#define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI
+ /***** END CONFIG_IDF_TARGET_ESP32P4 *****/
+
+#elif defined(CONFIG_IDF_TARGET_ESP8266)
+ #define WOLFSSL_ESP8266
+
+ /* There's no hardware encryption on the ESP8266 */
+ /* Consider using the ESP32-C2/C3/C6 */
+ #define NO_ESP32_CRYPT
+ #define NO_WOLFSSL_ESP32_CRYPT_HASH
+ #define NO_WOLFSSL_ESP32_CRYPT_AES
+ #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI
+ #ifndef FP_MAX_BITS
+ /* FP_MAX_BITS matters in wolfssl_test, not just TLS setting. */
+ /* MIN_FFDHE_FP_MAX_BITS = (MIN_FFDHE_BITS * 2); see settings.h */
+ #define FP_MAX_BITS MIN_FFDHE_FP_MAX_BITS
+ #endif
/***** END CONFIG_IDF_TARGET_ESP266 *****/
#elif defined(CONFIG_IDF_TARGET_ESP8684)
@@ -399,33 +837,91 @@
/***** END CONFIG_IDF_TARGET_ESP8684 *****/
#else
- /* Anything else encountered, disable HW accleration */
+ /* Anything else encountered, disable HW acceleration */
+ #warning "Unexpected CONFIG_IDF_TARGET_NN value"
#define NO_ESP32_CRYPT
#define NO_WOLFSSL_ESP32_CRYPT_HASH
#define NO_WOLFSSL_ESP32_CRYPT_AES
#define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI
#endif /* CONFIG_IDF_TARGET Check */
+/* RSA primitive specific definition, listed AFTER the Chipset detection */
+#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE)
+ /* Consider USE_FAST_MATH and SMALL_STACK */
+
+ #ifndef NO_RSA
+ #define ESP32_USE_RSA_PRIMITIVE
+
+ #ifdef CONFIG_ESP_MAIN_TASK_STACK_SIZE
+ /* See idf.py menuconfig for stack warning settings */
+ #if !defined(CONFIG_ESP_WOLFSSL_NO_STACK_SIZE_BUILD_WARNING)
+ #if CONFIG_ESP_MAIN_TASK_STACK_SIZE < 10500
+ #warning "RSA may be difficult with less than 10KB Stack"
+ #endif
+ #else
+ /* Implement your own stack warning here */
+ #endif
+ #endif
+
+ #if defined(CONFIG_IDF_TARGET_ESP32)
+ /* NOTE HW unreliable for small values! */
+ /* threshold for performance adjustment for HW primitive use */
+ /* X bits of G^X mod P greater than */
+ #undef ESP_RSA_EXPT_XBITS
+ #define ESP_RSA_EXPT_XBITS 32
+
+ /* X and Y of X * Y mod P greater than */
+ #undef ESP_RSA_MULM_BITS
+ #define ESP_RSA_MULM_BITS 16
+ #endif
+ #endif
+#endif
+
/* Debug options:
+See wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h for details on debug options
+
+optionally increase error message size for very long paths.
+#define WOLFSSL_MAX_ERROR_SZ 500
+
+Turn wolfSSL debugging on/off:
+ wolfSSL_Debugging_ON();
+ wolfSSL_Debugging_OFF();
#define ESP_VERIFY_MEMBLOCK
#define DEBUG_WOLFSSL
#define DEBUG_WOLFSSL_VERBOSE
#define DEBUG_WOLFSSL_SHA_MUTEX
+#define WOLFSSL_DEBUG_IGNORE_ASN_TIME
+#define WOLFSSL_DEBUG_CERT_BUNDLE
+#define WOLFSSL_DEBUG_CERT_BUNDLE_NAME
#define WOLFSSL_ESP32_CRYPT_DEBUG
#define WOLFSSL_ESP32_CRYPT_HASH_SHA224_DEBUG
#define NO_RECOVER_SOFTWARE_CALC
#define WOLFSSL_TEST_STRAY 1
#define USE_ESP_DPORT_ACCESS_READ_BUFFER
#define WOLFSSL_ESP32_HW_LOCK_DEBUG
+#define WOLFSSL_DEBUG_MUTEX
#define WOLFSSL_DEBUG_ESP_RSA_MULM_BITS
+#define WOLFSSL_DEBUG_ESP_HW_MOD_RSAMAX_BITS
+#define WOLFSSL_DEBUG_ESP_HW_MULTI_RSAMAX_BITS
#define ESP_DISABLE_HW_TASK_LOCK
+#define ESP_MONITOR_HW_TASK_LOCK
+#define USE_ESP_DPORT_ACCESS_READ_BUFFER
+
+See wolfcrypt/benchmark/benchmark.c for debug and other settings:
+
+Turn on benchmark timing debugging (CPU Cycles, RTOS ticks, etc)
+#define DEBUG_WOLFSSL_BENCHMARK_TIMING
+
+Turn on timer debugging (used when CPU cycles not available)
+#define WOLFSSL_BENCHMARK_TIMER_DEBUG
*/
/* Pause in a loop rather than exit. */
-#define WOLFSSL_ESPIDF_ERROR_PAUSE
+/* #define WOLFSSL_ESPIDF_ERROR_PAUSE */
+/* #define WOLFSSL_ESP32_HW_LOCK_DEBUG */
-/* #define WOLFSSL_HW_METRICS */
+#define WOLFSSL_HW_METRICS
/* for test.c */
/* #define HASH_SIZE_LIMIT */
@@ -453,8 +949,9 @@
** [Z = X * Y mod M] in esp_mp_mulmod() */
/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */
-#define WOLFSSL_PUBLIC_MP /* used by benchmark */
-#define USE_CERT_BUFFERS_2048
+
+/* used by benchmark: */
+#define WOLFSSL_PUBLIC_MP
/* when turning on ECC508 / ECC608 support
#define WOLFSSL_ESPWROOM32SE
@@ -463,12 +960,83 @@
#define ATCA_WOLFSSL
*/
-/* optional SM4 Ciphers. See https://github.com/wolfSSL/wolfsm
+/* optional SM4 Ciphers. See github.com/wolfSSL/wolfsm */
+
+/***************************** Certificate Macros *****************************
+ *
+ * The section below defines macros used in typically all of the wolfSSL
+ * examples such as the client and server for certs stored in header files.
+ *
+ * There are various certificate examples in this header file:
+ * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h
+ *
+ * To use the sample certificates in code (not recommended for production!):
+ *
+ * #if defined(USE_CERT_BUFFERS_2048) || defined(USE_CERT_BUFFERS_1024)
+ * #include
+ * #endif
+ *
+ * To use the sets of macros below, define *one* of these:
+ *
+ * USE_CERT_BUFFERS_1024 - ECC 1024 bit encoded ASN1
+ * USE_CERT_BUFFERS_2048 - RSA 2048 bit encoded ASN1
+ * WOLFSSL_SM[2,3,4] - SM Ciphers
+ *
+ * For example: define USE_CERT_BUFFERS_2048 to use CA Certs used in this
+ * wolfSSL function for the `ca_cert_der_2048` buffer, size and types:
+ *
+ * ret = wolfSSL_CTX_load_verify_buffer(ctx,
+ * CTX_CA_CERT,
+ * CTX_CA_CERT_SIZE,
+ * CTX_CA_CERT_TYPE);
+ *
+ * See https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_load_verify_buffer
+ *
+ * In this case the CTX_CA_CERT will be defined as `ca_cert_der_2048` as
+ * defined here: https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h
+ *
+ * The CTX_CA_CERT_SIZE and CTX_CA_CERT_TYPE are similarly used to reference
+ * array size and cert type respectively.
+ *
+ * Similarly for loading the private client key:
+ *
+ * ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx,
+ * CTX_CLIENT_KEY,
+ * CTX_CLIENT_KEY_SIZE,
+ * CTX_CLIENT_KEY_TYPE);
+ *
+ * see https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_use_privatekey_buffer
+ *
+ * Similarly, the other macros are for server certificates and keys:
+ * `CTX_SERVER_CERT` and `CTX_SERVER_KEY` are available.
+ *
+ * The certificate and key names are typically `static const unsigned char`
+ * arrays. The [NAME]_size are typically `sizeof([array name])`, and the types
+ * are the known wolfSSL encoding type integers (e.g. WOLFSSL_FILETYPE_PEM).
+ *
+ * See `SSL_FILETYPE_[name]` in
+ * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/ssl.h
+ *
+ * See Abstract Syntax Notation One (ASN.1) in:
+ * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/asn.h
+ *
+ * Optional SM4 Ciphers:
+ *
+ * Although the SM ciphers are shown here, the `certs_test_sm.h` may not yet
+ * be available. See:
+ * https://github.com/wolfSSL/wolfssl/pull/6825
+ * https://github.com/wolfSSL/wolfsm
+ *
+ * Uncomment these 3 macros to enable the SM Ciphers and use the macros below.
+ */
+
+/*
#define WOLFSSL_SM2
#define WOLFSSL_SM3
#define WOLFSSL_SM4
*/
+/* Conditional macros used in wolfSSL TLS client and server examples */
#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4)
#include
#define CTX_CA_CERT root_sm2
@@ -484,19 +1052,97 @@
#undef WOLFSSL_BASE16
#define WOLFSSL_BASE16
#else
- #define USE_CERT_BUFFERS_2048
- #define USE_CERT_BUFFERS_256
- #define CTX_CA_CERT ca_cert_der_2048
- #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048
- #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1
- #define CTX_SERVER_CERT server_cert_der_2048
- #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048
- #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1
- #define CTX_SERVER_KEY server_key_der_2048
- #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048
- #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1
-#endif
+ #if defined(USE_CERT_BUFFERS_2048)
+ #ifdef USE_CERT_BUFFERS_1024
+ #error "USE_CERT_BUFFERS_1024 is already defined. Pick one."
+ #endif
+ /* Be sure to include in app when using example certs: */
+ #if 0
+ /* Disabled here; see echoserver.c */
+ #include
+ /* or */
+ #include
+ #endif
+
+ #define USE_CERT_BUFFERS_256
+ #define CTX_CA_CERT ca_cert_der_2048
+ #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048
+ #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+
+ #define CTX_SERVER_CERT server_cert_der_2048
+ #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048
+ #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+ #define CTX_SERVER_KEY server_key_der_2048
+ #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048
+ #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1
+
+ #define CTX_CLIENT_CERT client_cert_der_2048
+ #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048
+ #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+ #define CTX_CLIENT_KEY client_key_der_2048
+ #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048
+ #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1
+
+ #elif defined(USE_CERT_BUFFERS_1024)
+ #ifdef USE_CERT_BUFFERS_2048
+ #error "USE_CERT_BUFFERS_2048 is already defined. Pick one."
+ #endif
+
+ /* Be sure to include in app when using example certs: */
+ #if 0
+ /* Disabled here; see echoserver.c */
+ #include
+ /* or */
+ #include
+ #endif
+
+ #define USE_CERT_BUFFERS_256
+ #define CTX_CA_CERT ca_cert_der_1024
+ #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_1024
+ #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+
+ #define CTX_CLIENT_CERT client_cert_der_1024
+ #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_1024
+ #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+ #define CTX_CLIENT_KEY client_key_der_1024
+ #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_1024
+ #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1
+
+ #define CTX_SERVER_CERT server_cert_der_1024
+ #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_1024
+ #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+ #define CTX_SERVER_KEY server_key_der_1024
+ #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_1024
+ #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1
+ #else
+ /* Optionally define custom cert arrays, sizes, and types here */
+ #error "Must define USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_1024"
+ #endif
+#endif /* Conditional key and cert constant names */
+
+/******************************************************************************
+** Sanity Checks
+******************************************************************************/
+#if defined(CONFIG_ESP_MAIN_TASK_STACK_SIZE)
+ #if defined(WOLFCRYPT_HAVE_SRP)
+ #if defined(FP_MAX_BITS)
+ #if FP_MAX_BITS < (8192 * 2)
+ #define ESP_SRP_MINIMUM_STACK_8K (24 * 1024)
+ #else
+ #define ESP_SRP_MINIMUM_STACK_8K (28 * 1024)
+ #endif
+ #else
+ #error "Please define FP_MAX_BITS when using WOLFCRYPT_HAVE_SRP."
+ #endif
+
+ #if (CONFIG_ESP_MAIN_TASK_STACK_SIZE < ESP_SRP_MINIMUM_STACK)
+ #warning "WOLFCRYPT_HAVE_SRP enabled with small stack size"
+ #endif
+ #endif
+#else
+ #warning "CONFIG_ESP_MAIN_TASK_STACK_SIZE not defined!"
+#endif
/* See settings.h for some of the possible hardening options:
*
* #define NO_ESPIDF_DEFAULT
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/CMakeLists.txt b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/CMakeLists.txt
index 0945f322..c4884bb0 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/CMakeLists.txt
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/CMakeLists.txt
@@ -1,6 +1,6 @@
# [wolfSSL Project]/main/CMakeLists.txt
#
-# Copyright (C) 2014-2024 wolfSSL Inc.
+# Copyright (C) 2014-2025 wolfSSL Inc.
#
# This file is part of wolfSSH.
#
@@ -28,28 +28,26 @@ message(STATUS "main cmake found WOLFSSL_COMPONENT_NAME = ${WOLFSSL_COMPONENT_NA
if(WIN32)
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS")
- message("Detected Windows")
+ message(STATUS "Detected Windows")
endif()
if(CMAKE_HOST_UNIX)
- message("Detected UNIX")
-endif()
-if(APPLE)
- message("Detected APPLE")
+ message(STATUS "Detected UNIX")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop")
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL")
- message("Detected WSL")
+ message(STATUS "Detected WSL")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32))
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX")
- message("Detected Linux")
+ message(STATUS "Detected Linux")
endif()
if(APPLE)
- # Windows-specific configuration here
+ # Apple-specific configuration here
+ message(STATUS "Detected APPLE")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE")
- message("Detected Apple")
+ message(STATUS "Detected Apple")
endif()
set (git_cmd "git")
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/echoserver.c b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/echoserver.c
index 49c90d42..1b7b2daf 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/echoserver.c
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/echoserver.c
@@ -1,6 +1,6 @@
/* echoserver.c
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
@@ -41,10 +41,27 @@
#include
#include
#include
+#include
#include
#include
+#include
-#include "echoserver.h"
+#ifdef WOLFSSL_ESPIDF
+ /* Optionally display server echo chars via ESP_LOGI here or in config. */
+ #define CONFIG_ESP_WOLFSSL_SSH_SERVER_ECHO
+ /* The echoserver source was copied to this project. For updates, see:
+ *
+ * https://github.com/wolfSSL/wolfssh/tree/master/examples/echoserver
+ */
+ #include "echoserver.h"
+ #ifdef CONFIG_ESP_WOLFSSL_SSH_SERVER_ECHO
+ #define SERVER_ECHO ESP_LOGI
+ #else
+ #define SERVER_ECHO ESP_LOGV
+ #endif
+#else
+ #include "examples/echoserver/echoserver.h"
+#endif
#if defined(WOLFSSL_PTHREADS) && defined(WOLFSSL_TEST_GLOBAL_REQ)
#include
@@ -328,6 +345,50 @@ static void *global_req(void *ctx)
#endif
+static void printKeyCompleteText(WOLFSSH* ssh, WS_Text id, const char* tag)
+{
+ char str[200];
+ size_t strSz = sizeof(str);
+ size_t ret;
+
+ ret = wolfSSH_GetText(ssh, id, str, strSz);
+ if (ret == strSz) {
+ printf("\tString size was not large enough for %s\n", tag);
+ }
+ printf("\t%-30s : %s\n", tag, str);
+}
+
+
+static void callbackKeyingComplete(void* ctx)
+{
+ WOLFSSH* ssh = (WOLFSSH*)ctx;
+
+ if (ssh != NULL) {
+ printf("Keying Complete:\n");
+ printKeyCompleteText(ssh, WOLFSSH_TEXT_KEX_ALGO,
+ "WOLFSSH_TEXT_KEX_ALGO");
+
+ printKeyCompleteText(ssh, WOLFSSH_TEXT_KEX_CURVE,
+ "WOLFSSH_TEXT_KEX_CURVE");
+
+ printKeyCompleteText(ssh, WOLFSSH_TEXT_KEX_HASH,
+ "WOLFSSH_TEXT_KEX_HASH");
+
+ printKeyCompleteText(ssh, WOLFSSH_TEXT_CRYPTO_IN_CIPHER,
+ "WOLFSSH_TEXT_CRYPTO_IN_CIPHER");
+
+ printKeyCompleteText(ssh, WOLFSSH_TEXT_CRYPTO_IN_MAC,
+ "WOLFSSH_TEXT_CRYPTO_IN_MAC");
+
+ printKeyCompleteText(ssh, WOLFSSH_TEXT_CRYPTO_OUT_CIPHER,
+ "WOLFSSH_TEXT_CRYPTO_OUT_CIPHER");
+
+ printKeyCompleteText(ssh, WOLFSSH_TEXT_CRYPTO_OUT_MAC,
+ "WOLFSSH_TEXT_CRYPTO_OUT_MAC");
+ }
+}
+
+
#ifdef WOLFSSH_AGENT
static const char EnvNameAuthPort[] = "SSH_AUTH_SOCK";
@@ -609,6 +670,87 @@ static int termios_show(int fd)
#endif /* SHELL_DEBUG */
+#ifdef WOLFSSH_STATIC_MEMORY
+ #ifndef WOLFSSL_STATIC_MEMORY
+ #error Requires the static memory functions from wolfSSL
+ #endif
+ #if defined(WOLFSSH_SCP) || defined(WOLFSSH_SHELL) || defined(WOLFSSH_FWD)
+ #warning Static memory configuration for SFTP, results may vary.
+ #endif
+ typedef WOLFSSL_HEAP_HINT ES_HEAP_HINT;
+
+ /* This static buffer is tuned for building with SFTP only. The static
+ * buffer size is calulated by multiplying the pairs of sizeList items
+ * and distList items and summing (32*64 + 128*118 + ...) and adding
+ * the sum of the distList values times the sizeof wc_Memory (rounded up
+ * to a word, 24). This total was 288kb plus change, rounded up to 289. */
+ #ifndef ES_STATIC_SIZES
+ #define ES_STATIC_SIZES 32,128,384,800,3120,8400,17552,32846,131072
+ #endif
+ #ifndef ES_STATIC_DISTS
+ #define ES_STATIC_DISTS 64,118,3,4,6,2,2,2,1
+ #endif
+ #ifndef ES_STATIC_LISTSZ
+ #define ES_STATIC_LISTSZ 9
+ #endif
+ #ifndef ES_STATIC_BUFSZ
+ #define ES_STATIC_BUFSZ (289*1024)
+ #endif
+ static const word32 static_sizeList[] = {ES_STATIC_SIZES};
+ static const word32 static_distList[] = {ES_STATIC_DISTS};
+ static byte static_buffer[ES_STATIC_BUFSZ];
+
+ static void wolfSSH_MemoryPrintStats(ES_HEAP_HINT* hint)
+ {
+ if (hint != NULL) {
+ word16 i;
+ WOLFSSL_MEM_STATS stats;
+
+ wolfSSL_GetMemStats(hint->memory, &stats);
+
+ /* print to stderr so is on the same pipe as WOLFSSL_DEBUG */
+ fprintf(stderr, "Total mallocs = %d\n", stats.totalAlloc);
+ fprintf(stderr, "Total frees = %d\n", stats.totalFr);
+ fprintf(stderr, "Current mallocs = %d\n", stats.curAlloc);
+ fprintf(stderr, "Available IO = %d\n", stats.avaIO);
+ fprintf(stderr, "Max con. handshakes = %d\n", stats.maxHa);
+ fprintf(stderr, "Max con. IO = %d\n", stats.maxIO);
+ fprintf(stderr, "State of memory blocks: size : available\n");
+ for (i = 0; i < WOLFMEM_MAX_BUCKETS; i++) {
+ fprintf(stderr, " %8d : %d\n",
+ stats.blockSz[i], stats.avaBlock[i]);
+ }
+ }
+ }
+
+ static void wolfSSH_MemoryConnPrintStats(ES_HEAP_HINT* hint)
+ {
+ if (hint != NULL) {
+ WOLFSSL_MEM_CONN_STATS* stats = hint->stats;
+
+ /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */
+ if (hint->memory->flag & WOLFMEM_TRACK_STATS
+ && hint->stats != NULL) {
+ fprintf(stderr, "peak connection memory = %d\n",
+ stats->peakMem);
+ fprintf(stderr, "current memory in use = %d\n",
+ stats->curMem);
+ fprintf(stderr, "peak connection allocs = %d\n",
+ stats->peakAlloc);
+ fprintf(stderr, "current connection allocs = %d\n",
+ stats->curAlloc);
+ fprintf(stderr, "total connection allocs = %d\n",
+ stats->totalAlloc);
+ fprintf(stderr, "total connection frees = %d\n\n",
+ stats->totalFr);
+ }
+ }
+ }
+#else
+ typedef void ES_HEAP_HINT;
+#endif
+
+
int ChildRunning = 0;
#ifdef WOLFSSH_SHELL
@@ -738,6 +880,25 @@ static int ssh_worker(thread_ctx_t* threadCtx)
ChildRunning = 1;
#endif
+#if defined(WOLFSSH_TERM) && defined(WOLFSSH_SHELL)
+ /* set initial size of terminal based on saved size */
+#if defined(HAVE_SYS_IOCTL_H)
+ wolfSSH_DoModes(ssh->modes, ssh->modesSz, childFd);
+ {
+ struct winsize s = {0,0,0,0};
+
+ s.ws_col = ssh->widthChar;
+ s.ws_row = ssh->heightRows;
+ s.ws_xpixel = ssh->widthPixels;
+ s.ws_ypixel = ssh->heightPixels;
+
+ ioctl(childFd, TIOCSWINSZ, &s);
+ }
+#endif /* HAVE_SYS_IOCTL_H */
+
+ wolfSSH_SetTerminalResizeCtx(ssh, (void*)&childFd);
+#endif /* WOLFSSH_TERM && WOLFSSH_SHELL */
+
while (ChildRunning) {
fd_set readFds;
WS_SOCKET_T maxFd;
@@ -824,6 +985,11 @@ static int ssh_worker(thread_ctx_t* threadCtx)
#else
cnt_w = wolfSSH_ChannelIdSend(ssh, shellChannelId,
threadCtx->channelBuffer, cnt_r);
+ /* Only the Espressif example shows characters */
+ SERVER_ECHO("echo", "Byte= %d, Char=`%c`, len=%d",
+ (byte)threadCtx->channelBuffer[0],
+ (char)threadCtx->channelBuffer[0],
+ cnt_r);
if (cnt_r > 0) {
int doStop = process_bytes(threadCtx,
threadCtx->channelBuffer, cnt_r);
@@ -1162,7 +1328,7 @@ static int sftp_worker(thread_ctx_t* threadCtx)
s = (WS_SOCKET_T)wolfSSH_get_fd(ssh);
do {
- if (wolfSSH_SFTP_PendingSend(ssh)) {
+ if (ret == WS_WANT_WRITE || wolfSSH_SFTP_PendingSend(ssh)) {
/* Yes, process the SFTP data. */
ret = wolfSSH_SFTP_read(ssh);
error = wolfSSH_get_error(ssh);
@@ -1196,11 +1362,8 @@ static int sftp_worker(thread_ctx_t* threadCtx)
}
else if (selected == WS_SELECT_TIMEOUT) {
timeout = TEST_SFTP_TIMEOUT_LONG;
- continue;
}
-
- if (ret == WS_WANT_READ || ret == WS_WANT_WRITE ||
- selected == WS_SELECT_RECV_READY) {
+ else if (selected == WS_SELECT_RECV_READY) {
ret = wolfSSH_worker(ssh, NULL);
error = wolfSSH_get_error(ssh);
if (ret == WS_REKEYING) {
@@ -1213,13 +1376,18 @@ static int sftp_worker(thread_ctx_t* threadCtx)
error == WS_WINDOW_FULL) {
timeout = TEST_SFTP_TIMEOUT;
ret = error;
- continue;
}
if (error == WS_EOF) {
break;
}
if (ret != WS_SUCCESS && ret != WS_CHAN_RXD) {
+ if (ret == WS_WANT_WRITE) {
+ /* recall wolfSSH_worker here because is likely our custom
+ * highwater callback that returned up a WS_WANT_WRITE */
+ ret = wolfSSH_worker(ssh, NULL);
+ continue; /* continue on if our send got a want write */
+ }
/* If not successful and no channel data, leave. */
break;
}
@@ -1278,7 +1446,8 @@ static int NonBlockSSH_accept(WOLFSSH* ssh)
while ((ret != WS_SUCCESS
&& ret != WS_SCP_COMPLETE && ret != WS_SFTP_COMPLETE)
- && (error == WS_WANT_READ || error == WS_WANT_WRITE)) {
+ && (error == WS_WANT_READ || error == WS_WANT_WRITE ||
+ error == WS_AUTH_PENDING)) {
if (error == WS_WANT_READ)
printf("... server would read block\n");
@@ -1288,7 +1457,8 @@ static int NonBlockSSH_accept(WOLFSSH* ssh)
select_ret = tcp_select(sockfd, 1);
if (select_ret == WS_SELECT_RECV_READY ||
select_ret == WS_SELECT_ERROR_READY ||
- error == WS_WANT_WRITE)
+ error == WS_WANT_WRITE ||
+ error == WS_AUTH_PENDING)
{
ret = wolfSSH_accept(ssh);
error = wolfSSH_get_error(ssh);
@@ -1310,11 +1480,16 @@ static THREAD_RETURN WOLFSSH_THREAD server_worker(void* vArgs)
passwdRetry = MAX_PASSWD_RETRY;
- if (!threadCtx->nonBlock)
+ if (!threadCtx->nonBlock) {
ret = wolfSSH_accept(threadCtx->ssh);
- else
+ if (wolfSSH_get_error(threadCtx->ssh) == WS_AUTH_PENDING) {
+ printf("Auth pending error, use -N for non blocking\n");
+ printf("Trying to close down the connection\n");
+ }
+ }
+ else {
ret = NonBlockSSH_accept(threadCtx->ssh);
-
+ }
#ifdef WOLFSSH_SCP
/* finish off SCP operation */
if (ret == WS_SCP_INIT) {
@@ -1423,8 +1598,19 @@ static THREAD_RETURN WOLFSSH_THREAD server_worker(void* vArgs)
threadCtx->fwdCbCtx.originName = NULL;
}
#endif
+
+#ifdef WOLFSSH_STATIC_MEMORY
+ wolfSSH_MemoryConnPrintStats(threadCtx->ssh->ctx->heap);
+#endif
+
wolfSSH_free(threadCtx->ssh);
+ /* For socket error, it could have been the previous connection just ended
+ * early. Not really an error, no need to report error and quit. */
+ if (error == WS_SOCKET_ERROR_E) {
+ ret = 0;
+ }
+
if (ret != 0) {
fprintf(stderr, "Error [%d] \"%s\" with handling connection.\n", ret,
wolfSSH_ErrorToName(error));
@@ -1456,21 +1642,19 @@ static int load_file(const char* fileName, byte* buf, word32* bufSz)
fileSz = (word32)WFTELL(NULL, file);
WREWIND(NULL, file);
- if (fileSz > *bufSz) {
- if (buf == NULL)
- *bufSz = fileSz;
+ if (buf == NULL || fileSz > *bufSz) {
+ *bufSz = fileSz;
WFCLOSE(NULL, file);
return 0;
}
readSz = (word32)WFREAD(NULL, buf, 1, fileSz, file);
- if (readSz < fileSz) {
- WFCLOSE(NULL, file);
- return 0;
- }
-
WFCLOSE(NULL, file);
+ if (readSz < fileSz) {
+ fileSz = 0;
+ }
+
return fileSz;
}
#endif /* NO_FILESYSTEM */
@@ -1633,21 +1817,24 @@ static const char samplePublicKeyEccBuffer[] =
#endif
#ifndef WOLFSSH_NO_RSA
-static const char samplePublicKeyRsaBuffer[] =
- "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9P3ZFowOsONXHD5MwWiCciXytBRZGho"
- "MNiisWSgUs5HdHcACuHYPi2W6Z1PBFmBWT9odOrGRjoZXJfDDoPi+j8SSfDGsc/hsCmc3G"
- "p2yEhUZUEkDhtOXyqjns1ickC9Gh4u80aSVtwHRnJZh9xPhSq5tLOhId4eP61s+a5pwjTj"
- "nEhBaIPUJO2C/M0pFnnbZxKgJlX7t1Doy7h5eXxviymOIvaCZKU+x5OopfzM/wFkey0EPW"
- "NmzI5y/+pzU5afsdeEWdiQDIQc80H6Pz8fsoFPvYSG+s4/wz0duu7yeeV1Ypoho65Zr+pE"
- "nIf7dO0B8EblgWt+ud+JI8wrAhfE4x hansel\n"
- "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqDwRVTRVk/wjPhoo66+Mztrc31KsxDZ"
- "+kAV0139PHQ+wsueNpba6jNn5o6mUTEOrxrz0LMsDJOBM7CmG0983kF4gRIihECpQ0rcjO"
- "P6BSfbVTE9mfIK5IsUiZGd8SoE9kSV2pJ2FvZeBQENoAxEFk0zZL9tchPS+OCUGbK4SDjz"
- "uNZl/30Mczs73N3MBzi6J1oPo7sFlqzB6ecBjK2Kpjus4Y1rYFphJnUxtKvB0s+hoaadru"
- "biE57dK6BrH5iZwVLTQKux31uCJLPhiktI3iLbdlGZEctJkTasfVSsUizwVIyRjhVKmbdI"
- "RGwkU38D043AR1h0mUoGCPIKuqcFMf gretel\n";
-#endif
-
+#ifdef WOLFSSH_TPM
+ static const char* sampleTpmPublicKeyRsaBuffer = "";
+#else
+ static const char* samplePublicKeyRsaBuffer =
+ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqDwRVTRVk/wjPhoo66+Mztrc31KsxDZ"
+ "+kAV0139PHQ+wsueNpba6jNn5o6mUTEOrxrz0LMsDJOBM7CmG0983kF4gRIihECpQ0rcjO"
+ "P6BSfbVTE9mfIK5IsUiZGd8SoE9kSV2pJ2FvZeBQENoAxEFk0zZL9tchPS+OCUGbK4SDjz"
+ "uNZl/30Mczs73N3MBzi6J1oPo7sFlqzB6ecBjK2Kpjus4Y1rYFphJnUxtKvB0s+hoaadru"
+ "biE57dK6BrH5iZwVLTQKux31uCJLPhiktI3iLbdlGZEctJkTasfVSsUizwVIyRjhVKmbdI"
+ "RGwkU38D043AR1h0mUoGCPIKuqcFMf gretel\n"
+ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9P3ZFowOsONXHD5MwWiCciXytBRZGho"
+ "MNiisWSgUs5HdHcACuHYPi2W6Z1PBFmBWT9odOrGRjoZXJfDDoPi+j8SSfDGsc/hsCmc3G"
+ "p2yEhUZUEkDhtOXyqjns1ickC9Gh4u80aSVtwHRnJZh9xPhSq5tLOhId4eP61s+a5pwjTj"
+ "nEhBaIPUJO2C/M0pFnnbZxKgJlX7t1Doy7h5eXxviymOIvaCZKU+x5OopfzM/wFkey0EPW"
+ "NmzI5y/+pzU5afsdeEWdiQDIQc80H6Pz8fsoFPvYSG+s4/wz0duu7yeeV1Ypoho65Zr+pE"
+ "nIf7dO0B8EblgWt+ud+JI8wrAhfE4x hansel\n";
+#endif /* WOLFSSH_TPM */
+#endif /* WOLFSSH_NO_RSA */
#ifdef WOLFSSH_ALLOW_USERAUTH_NONE
@@ -1845,6 +2032,35 @@ static int LoadPasswdList(StrList* strList, PwMapList* mapList)
return count;
}
+#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+static int LoadKeyboardList(StrList* strList, PwMapList* mapList)
+{
+ char names[256];
+ char* passwd;
+ int count = 0;
+
+ while (strList) {
+ WSTRNCPY(names, strList->str, sizeof names - 1);
+ passwd = WSTRCHR(names, ':');
+ if (passwd != NULL) {
+ *passwd = 0;
+ passwd++;
+
+ PwMapNew(mapList, WOLFSSH_USERAUTH_KEYBOARD,
+ (byte*)names, (word32)WSTRLEN(names),
+ (byte*)passwd, (word32)WSTRLEN(passwd));
+ }
+ else {
+ fprintf(stderr, "Ignoring password: %s\n", names);
+ }
+
+ strList = strList->next;
+ count++;
+ }
+
+ return count;
+}
+#endif
#ifndef NO_FILESYSTEM
static int LoadPubKeyList(StrList* strList, int format, PwMapList* mapList)
@@ -1916,6 +2132,48 @@ static int LoadPubKeyList(StrList* strList, int format, PwMapList* mapList)
}
#endif
+#ifdef WOLFSSH_TPM
+static char* LoadTpmSshKey(const char* keyFile, const char* username)
+{
+ WFILE* file = NULL;
+ char* buffer = NULL;
+ char* ret = NULL;
+ long length;
+ size_t usernameLen;
+
+ if (WFOPEN(NULL, &file, keyFile, "rb") != 0) {
+ fprintf(stderr,
+ "Failed to open TPM key file: %s\n", keyFile);
+ return NULL;
+ }
+ WFSEEK(NULL, file, 0, WSEEK_END);
+ length = WFTELL(NULL, file);
+ WREWIND(NULL, file);
+
+ usernameLen = WSTRLEN(username);
+ buffer = (char*)WMALLOC(length + usernameLen + 2, NULL, DYNTYPE_BUFFER);
+ if (buffer) {
+ if (WFREAD(NULL, buffer, 1, length, file) == (size_t)length) {
+ while (length > 0 && (buffer[length-1] == '\n' ||
+ buffer[length-1] == '\r')) {
+ length--;
+ }
+ buffer[length] = ' ';
+ WMEMCPY(buffer + length + 1, username, usernameLen);
+ buffer[length + 1 + usernameLen] = '\n';
+ buffer[length + 2 + usernameLen] = '\0';
+ ret = buffer;
+ }
+ else {
+ WFREE(buffer, NULL, DYNTYPE_BUFFER);
+ }
+ }
+
+ WFCLOSE(NULL, file);
+ return ret;
+}
+#endif
+
static int wsUserAuthResult(byte res,
WS_UserAuthData* authData,
void* ctx)
@@ -1928,6 +2186,7 @@ static int wsUserAuthResult(byte res,
}
+static int userAuthWouldBlock = 0;
static int wsUserAuth(byte authType,
WS_UserAuthData* authData,
void* ctx)
@@ -1941,9 +2200,18 @@ static int wsUserAuth(byte authType,
return WOLFSSH_USERAUTH_FAILURE;
}
+ if (userAuthWouldBlock > 0) {
+ printf("User Auth would block ....\n");
+ userAuthWouldBlock--;
+ return WOLFSSH_USERAUTH_WOULD_BLOCK;
+ }
+
if (authType != WOLFSSH_USERAUTH_PASSWORD &&
#ifdef WOLFSSH_ALLOW_USERAUTH_NONE
authType != WOLFSSH_USERAUTH_NONE &&
+#endif
+#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+ authType != WOLFSSH_USERAUTH_KEYBOARD &&
#endif
authType != WOLFSSH_USERAUTH_PUBLICKEY) {
@@ -1955,6 +2223,16 @@ static int wsUserAuth(byte authType,
authData->sf.password.passwordSz,
authHash);
}
+#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+ else if (authType == WOLFSSH_USERAUTH_KEYBOARD) {
+ if (authData->sf.keyboard.responseCount != 1) {
+ return WOLFSSH_USERAUTH_FAILURE;
+ }
+ wc_Sha256Hash(authData->sf.keyboard.responses[0],
+ authData->sf.keyboard.responseLengths[0],
+ authHash);
+ }
+#endif
else if (authType == WOLFSSH_USERAUTH_PUBLICKEY) {
wc_Sha256Hash(authData->sf.publicKey.publicKey,
authData->sf.publicKey.publicKeySz,
@@ -2055,6 +2333,16 @@ static int wsUserAuth(byte authType,
WOLFSSH_USERAUTH_REJECTED;
}
}
+ #ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+ else if (authData->type == WOLFSSH_USERAUTH_KEYBOARD) {
+ if (WMEMCMP(map->p, authHash, WC_SHA256_DIGEST_SIZE) == 0) {
+ return WOLFSSH_USERAUTH_SUCCESS;
+ }
+ else {
+ return WOLFSSH_USERAUTH_INVALID_PASSWORD;
+ }
+ }
+ #endif
#ifdef WOLFSSH_ALLOW_USERAUTH_NONE
else if (authData->type == WOLFSSH_USERAUTH_NONE) {
return WOLFSSH_USERAUTH_SUCCESS;
@@ -2070,6 +2358,15 @@ static int wsUserAuth(byte authType,
return WOLFSSH_USERAUTH_INVALID_USER;
}
+#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+static int keyboardCallback(WS_UserAuthData_Keyboard *kbAuth, void *ctx)
+{
+ WS_UserAuthData_Keyboard *kbAuthData = (WS_UserAuthData_Keyboard*) ctx;
+ WMEMCPY(kbAuth, kbAuthData, sizeof(WS_UserAuthData_Keyboard));
+
+ return WS_SUCCESS;
+}
+#endif
#ifdef WOLFSSH_SFTP
/*
@@ -2130,7 +2427,8 @@ static int SetDefaultSftpPath(WOLFSSH* ssh, const char* defaultSftpPath)
static void ShowUsage(void)
{
- printf("echoserver %s\n", LIBWOLFSSH_VERSION_STRING);
+ printf("echoserver %s linked with wolfSSL %s\n", LIBWOLFSSH_VERSION_STRING,
+ LIBWOLFSSL_VERSION_STRING);
printf(" -? display this help and exit\n");
printf(" -1 exit after single (one) connection\n");
printf(" -e expect ECC public key from client\n");
@@ -2147,33 +2445,42 @@ static void ShowUsage(void)
" (user assumed in comment)\n");
printf(" -I :\n"
" load in a SSH public key to accept from peer\n");
+ printf(" -s load in a TPM public key file to replace default hansel key\n");
printf(" -J :\n"
" load in an X.509 PEM cert to accept from peer\n");
printf(" -K :\n"
" load in an X.509 DER cert to accept from peer\n");
printf(" -P :\n"
" add password to accept from peer\n");
+#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+ printf(" -i :\n"
+ " add passowrd to accept via keyboard-interactive "
+ "from peer\n");
+#endif
#ifdef WOLFSSH_CERTS
printf(" -a load in a root CA certificate file\n");
#endif
+ printf(" -k set the comma separated list of key algos to use\n");
+ printf(" -x set the comma separated list of key exchange algos "
+ "to use\n");
+ printf(" -m set the comma separated list of mac algos to use\n");
+ printf(" -b test user auth would block\n");
+ printf(" -H set test highwater callback\n");
}
-static INLINE void SignalTcpReady(func_args* serverArgs, word16 port)
+static INLINE void SignalTcpReady(tcp_ready* ready, word16 port)
{
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) && \
!defined(__MINGW32__) && !defined(SINGLE_THREADED)
- tcp_ready* ready = serverArgs->signal;
- if (ready != NULL) {
- pthread_mutex_lock(&ready->mutex);
- ready->ready = 1;
- ready->port = port;
- pthread_cond_signal(&ready->cond);
- pthread_mutex_unlock(&ready->mutex);
- }
+ pthread_mutex_lock(&ready->mutex);
+ ready->ready = 1;
+ ready->port = port;
+ pthread_cond_signal(&ready->cond);
+ pthread_mutex_unlock(&ready->mutex);
#else
- (void)serverArgs;
- (void)port;
+ WOLFSSH_UNUSED(ready);
+ WOLFSSH_UNUSED(port);
#endif
}
@@ -2183,6 +2490,36 @@ static INLINE void SignalTcpReady(func_args* serverArgs, word16 port)
WOLFSSL_RETURN_FROM_THREAD(0); \
} while(0)
+
+static byte wantwrite = 0; /*flag to return want write on first highwater call*/
+static int my_highwaterCb(byte dir, void* ctx)
+{
+ int ret = WS_SUCCESS;
+
+ WOLFSSH_UNUSED(dir);
+
+ printf("my_highwaterCb called\n");
+ if (ctx) {
+ WOLFSSH* ssh = (WOLFSSH*)ctx;
+
+ printf("HIGHWATER MARK: (%u) %s", wolfSSH_GetHighwater(ssh),
+ (dir == WOLFSSH_HWSIDE_RECEIVE) ? "receive\n" : "transmit\n");
+ if (dir == WOLFSSH_HWSIDE_RECEIVE) {
+ if (!wantwrite) {
+ ret = WS_WANT_WRITE;
+ wantwrite = 1;
+ printf("Forcing a want write on first highwater callback\n");
+ }
+ else {
+ ret = wolfSSH_TriggerKeyExchange(ssh);
+ }
+ }
+
+ }
+
+ return ret;
+}
+
THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
{
func_args* serverArgs = (func_args*)args;
@@ -2194,9 +2531,22 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
StrList* derPubKeyList = NULL;
#endif
StrList* passwdList = NULL;
+ #ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+ StrList* keyboardList = NULL;
+ WS_UserAuthData_Keyboard kbAuthData;
+ #endif
WS_SOCKET_T listenFd = WOLFSSH_SOCKET_INVALID;
+ int useCustomHighWaterCb = 0;
word32 defaultHighwater = EXAMPLE_HIGHWATER_MARK;
word32 threadCount = 0;
+ const char* keyList = NULL;
+ const char* kexList = NULL;
+ const char* macList = NULL;
+ const char* cipherList = NULL;
+ ES_HEAP_HINT* heap = NULL;
+ #ifdef WOLFSSH_TPM
+ static char* tpmKeyPath = NULL;
+ #endif
int multipleConnections = 1;
int userEcc = 0;
int peerEcc = 0;
@@ -2216,9 +2566,12 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
int argc = serverArgs->argc;
char** argv = serverArgs->argv;
serverArgs->return_code = EXIT_SUCCESS;
+#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+ kbAuthData.promptCount = 0;
+#endif
if (argc > 0) {
- const char* optlist = "?1a:d:efEp:R:Ni:j:I:J:K:P:";
+ const char* optlist = "?1a:d:efEp:R:Ni:j:i:I:J:K:P:k:b:x:m:c:s:H";
myoptind = 0;
while ((ch = mygetopt(argc, argv, optlist)) != -1) {
switch (ch) {
@@ -2240,6 +2593,10 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
userEcc = 1;
break;
+ case 'k' :
+ keyList = myoptarg;
+ break;
+
case 'E':
peerEcc = 1;
break;
@@ -2298,6 +2655,38 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
passwdList = StrListAdd(passwdList, myoptarg);
break;
+#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+ case 'i':
+ keyboardList = StrListAdd(keyboardList, myoptarg);
+ break;
+#endif
+
+ case 'b':
+ userAuthWouldBlock = atoi(myoptarg);
+ break;
+
+ case 'x':
+ kexList = myoptarg;
+ break;
+
+ case 'm':
+ macList = myoptarg;
+ break;
+
+ case 'c':
+ cipherList = myoptarg;
+ break;
+
+ case 's':
+ #ifdef WOLFSSH_TPM
+ tpmKeyPath = myoptarg;
+ #endif
+ break;
+
+ case 'H':
+ useCustomHighWaterCb = 1;
+ break;
+
default:
ShowUsage();
serverArgs->return_code = MY_EX_USAGE;
@@ -2330,16 +2719,73 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
ES_ERROR("Couldn't initialize wolfSSH.\n");
}
- ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_SERVER, NULL);
+ /* Load custom TPM key if specified */
+ #ifdef WOLFSSH_TPM
+ if (tpmKeyPath != NULL) {
+ const char* newBuffer = LoadTpmSshKey(tpmKeyPath, "hansel");
+ if (newBuffer != NULL) {
+ sampleTpmPublicKeyRsaBuffer = newBuffer;
+ }
+ else {
+ ES_ERROR("Failed to load TPM key from %s\n", tpmKeyPath);
+ }
+ printf("New sampleTpmPublicKeyRsaBuffer:\n%s\n", sampleTpmPublicKeyRsaBuffer);
+ }
+ else {
+ printf("No TPM key loaded\n");
+ }
+ #endif
+
+ #ifdef WOLFSSH_STATIC_MEMORY
+ {
+ int ret;
+
+ ret = wc_LoadStaticMemory_ex(&heap,
+ ES_STATIC_LISTSZ, static_sizeList, static_distList,
+ static_buffer, sizeof(static_buffer),
+ WOLFMEM_GENERAL|WOLFMEM_TRACK_STATS, 0);
+ if (ret != 0) {
+ ES_ERROR("Couldn't set up static memory pool.\n");
+ }
+ }
+ #endif /* WOLFSSH_STATIC_MEMORY */
+
+ ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_SERVER, heap);
if (ctx == NULL) {
ES_ERROR("Couldn't allocate SSH CTX data.\n");
}
+ wolfSSH_SetKeyingCompletionCb(ctx, callbackKeyingComplete);
+ if (keyList) {
+ if (wolfSSH_CTX_SetAlgoListKey(ctx, keyList) != WS_SUCCESS) {
+ ES_ERROR("Error setting key list.\n");
+ }
+ }
+
+ if (kexList) {
+ if (wolfSSH_CTX_SetAlgoListKex(ctx, kexList) != WS_SUCCESS) {
+ ES_ERROR("Error setting kex list.\n");
+ }
+ }
+
+ if (macList) {
+ if (wolfSSH_CTX_SetAlgoListMac(ctx, macList) != WS_SUCCESS) {
+ ES_ERROR("Error setting mac list.\n");
+ }
+ }
+
+ if (cipherList) {
+ if (wolfSSH_CTX_SetAlgoListCipher(ctx, cipherList) != WS_SUCCESS) {
+ ES_ERROR("Error setting cipher list.\n");
+ }
+ }
+
WMEMSET(&pwMapList, 0, sizeof(pwMapList));
if (serverArgs->user_auth == NULL)
wolfSSH_SetUserAuth(ctx, wsUserAuth);
else
wolfSSH_SetUserAuth(ctx, ((func_args*)args)->user_auth);
+
wolfSSH_SetUserAuthResult(ctx, wsUserAuthResult);
wolfSSH_CTX_SetBanner(ctx, echoserverBanner);
#ifdef WOLFSSH_AGENT
@@ -2372,6 +2818,37 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
passwdList = NULL;
}
+#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+ if (keyboardList) {
+ LoadKeyboardList(keyboardList, &pwMapList);
+ StrListFree(keyboardList);
+ keyboardList = NULL;
+ kbAuthData.promptCount = 1;
+ kbAuthData.promptName = NULL;
+ kbAuthData.promptNameSz = 0;
+ kbAuthData.promptInstruction = NULL;
+ kbAuthData.promptInstructionSz = 0;
+ kbAuthData.promptLanguage = NULL;
+ kbAuthData.promptLanguageSz = 0;
+ kbAuthData.prompts = (byte**)WMALLOC(sizeof(byte*), NULL, 0);
+ if (kbAuthData.prompts == NULL) {
+ ES_ERROR("Error allocating prompts");
+ }
+ kbAuthData.prompts[0] = (byte*)"KB Auth Password: ";
+ kbAuthData.promptLengths = (word32*)WMALLOC(sizeof(word32), NULL, 0);
+ if (kbAuthData.prompts == NULL) {
+ ES_ERROR("Error allocating promptLengths");
+ }
+ kbAuthData.promptLengths[0] = 18;
+ kbAuthData.promptEcho = (byte*)WMALLOC(sizeof(byte), NULL, 0);
+ if (kbAuthData.prompts == NULL) {
+ ES_ERROR("Error allocating promptEcho");
+ }
+ kbAuthData.promptEcho[0] = 0;
+ wolfSSH_SetKeyboardAuthPrompts(ctx, keyboardCallback);
+ }
+#endif
+
{
const char* bufName = NULL;
#ifndef WOLFSSH_SMALL_STACK
@@ -2475,7 +2952,11 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
}
else {
#ifndef WOLFSSH_NO_RSA
- bufName = samplePublicKeyRsaBuffer;
+ #ifdef WOLFSSH_TPM
+ bufName = sampleTpmPublicKeyRsaBuffer;
+ #else
+ bufName = samplePublicKeyRsaBuffer;
+ #endif
#endif
}
if (bufName != NULL) {
@@ -2543,6 +3024,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
#endif
}
+ SignalTcpReady(serverArgs->signal, port);
+
do {
WS_SOCKET_T clientFd = WOLFSSH_SOCKET_INVALID;
#ifdef WOLFSSL_NUCLEUS
@@ -2566,13 +3049,33 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
WFREE(threadCtx, NULL, 0);
ES_ERROR("Couldn't allocate SSH data.\n");
}
+
+ #ifdef WOLFSSH_STATIC_MEMORY
+ wolfSSH_MemoryConnPrintStats(heap);
+ #endif
wolfSSH_SetUserAuthCtx(ssh, &pwMapList);
+ wolfSSH_SetKeyingCompletionCbCtx(ssh, (void*)ssh);
+ #ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+ wolfSSH_SetKeyboardAuthCtx(ssh, &kbAuthData);
+ #endif
+
/* Use the session object for its own highwater callback ctx */
if (defaultHighwater > 0) {
wolfSSH_SetHighwaterCtx(ssh, (void*)ssh);
wolfSSH_SetHighwater(ssh, defaultHighwater);
}
+ if (useCustomHighWaterCb) {
+ if (defaultHighwater == EXAMPLE_HIGHWATER_MARK) {
+ defaultHighwater = 2000; /* lower the highwater mark to hit the
+ * callback sooner */
+ }
+ printf("Registering highwater callback that returns want write\n");
+ wolfSSH_SetHighwaterCb(ctx, defaultHighwater, my_highwaterCb);
+ wolfSSH_SetHighwaterCtx(ssh, (void*)ssh);
+ wolfSSH_SetHighwater(ssh, defaultHighwater);
+ }
+
#ifdef WOLFSSH_SFTP
if (SetDefaultSftpPath(ssh, defaultSftpPath) != 0) {
ES_ERROR("Couldn't store default sftp path.\n");
@@ -2600,8 +3103,6 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
}
#endif
- SignalTcpReady(serverArgs, port);
-
#ifdef WOLFSSL_NUCLEUS
clientFd = NU_Accept(listenFd, &clientAddr, 0);
#else
@@ -2641,9 +3142,20 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
if (listenFd != WOLFSSH_SOCKET_INVALID) {
WCLOSESOCKET(listenFd);
}
+#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
+ if (kbAuthData.promptCount > 0) {
+ WFREE(kbAuthData.promptLengths, NULL, 0);
+ WFREE(kbAuthData.prompts, NULL, 0);
+ WFREE(kbAuthData.promptEcho, NULL, 0);
+ }
+#endif
wc_FreeMutex(&doneLock);
PwMapListDelete(&pwMapList);
wolfSSH_CTX_free(ctx);
+#ifdef WOLFSSH_STATIC_MEMORY
+ wolfSSH_MemoryPrintStats(heap);
+#endif
+
if (wolfSSH_Cleanup() != WS_SUCCESS) {
ES_ERROR("Couldn't clean up wolfSSH.\n");
}
@@ -2658,8 +3170,6 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
#endif /* NO_WOLFSSH_SERVER */
-void wolfSSL_Debugging_ON(void);
-
int wolfSSH_Echoserver(int argc, char** argv)
{
func_args args;
@@ -2670,8 +3180,11 @@ int wolfSSH_Echoserver(int argc, char** argv)
WSTARTTCP();
- #ifdef DEBUG_WOLFSSH
+
+ #ifdef DEBUG_WOLFSSL
wolfSSL_Debugging_ON();
+ #endif
+ #ifdef DEBUG_WOLFSSH
wolfSSH_Debugging_ON();
#endif
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/echoserver.h b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/echoserver.h
index 91a9bf2d..1e685bc1 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/echoserver.h
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/echoserver.h
@@ -1,6 +1,6 @@
/* echoserver.h
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/main.h b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/main.h
index 9aa80070..538c5b37 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/main.h
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/main.h
@@ -1,6 +1,6 @@
/* template main.h
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/time_helper.h b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/time_helper.h
index e7b8108d..6e9f6b9d 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/time_helper.h
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/time_helper.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/wifi_connect.h b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/wifi_connect.h
index 9ac4d7f5..1817a50c 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/wifi_connect.h
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/include/wifi_connect.h
@@ -1,6 +1,6 @@
/* wifi_connect.h
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
@@ -62,7 +62,7 @@
#else
#warning "did not detect environment. using ~/my_private_config.h"
#include "~/my_private_config.h"
- #endif
+ #endif
#else
/*
@@ -72,17 +72,44 @@
** If you'd rather not, just change the below entries to strings with
** the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
*/
+ /* Some older versions use ESP_WIFI_SSID via Kconfig */
#ifdef CONFIG_ESP_WIFI_SSID
+ /* Overwrite the example SSID with the value set in menuconfig */
+ #undef EXAMPLE_ESP_WIFI_SSID
#define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID
- #else
- #define EXAMPLE_ESP_WIFI_SSID "MYSSID_WIFI_CONNECT"
#endif
- #ifdef CONFIG_ESP_WIFI_PASSWORD
- #define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD
- #else
- #define EXAMPLE_ESP_WIFI_PASS "MYPASSWORD_WIFI_CONNECT"
+ /* Newer versions of the ESP-IDF use EXAMPLE_WIFI_SSID via Kconfig */
+ #ifdef CONFIG_EXAMPLE_WIFI_SSID
+ /* Overwrite the example SSID with the value set in menuconfig */
+ #undef EXAMPLE_ESP_WIFI_SSID
+ #define EXAMPLE_ESP_WIFI_SSID CONFIG_EXAMPLE_WIFI_SSID
#endif
+
+ /* Some older versions use ESP_WIFI_PASSWORD via Kconfig */
+ #ifdef CONFIG_ESP_WIFI_PASSWORD
+ /* Overwrite the example password with the value set in menuconfig */
+ #undef EXAMPLE_ESP_WIFI_PASS
+ #define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD
+ #endif
+
+ /* Newer versions use CONFIG_ESP_WIFI_PASSWORD via Kconfig */
+ #ifdef CONFIG_EXAMPLE_WIFI_PASSWORD
+ /* Overwrite the example SSID with the value set in menuconfig */
+ #undef EXAMPLE_ESP_WIFI_PASS
+ #define EXAMPLE_ESP_WIFI_PASS CONFIG_EXAMPLE_WIFI_PASSWORD
+ #endif
+
+#endif
+
+ /* Ensure EXAMPLE_ESP_WIFI_SSID and EXAMPLE_ESP_WIFI_PASS are not blank: */
+#ifndef EXAMPLE_ESP_WIFI_SSID
+ #warning "Setting default WiFi SSID: MYSSID_WIFI_CONNECT"
+ #define EXAMPLE_ESP_WIFI_SSID "MYSSID_WIFI_CONNECT"
+#endif
+#ifndef EXAMPLE_ESP_WIFI_PASS
+ #warning "Setting default WiFi SSID Password: MYSSID_WIFI_CONNECT"
+ #define EXAMPLE_ESP_WIFI_PASS "MYPASSWORD_WIFI_CONNECT"
#endif
/* ESP lwip */
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/main.c b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/main.c
index 8a0db6f0..e52a886a 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/main.c
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/main.c
@@ -1,6 +1,6 @@
/* main.c
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
@@ -65,9 +65,17 @@ void app_main(void)
#endif
#ifdef HAVE_VERSION_EXTENDED_INFO
- // esp_ShowExtendedSystemInfo();
+ esp_ShowExtendedSystemInfo();
+#endif
+#ifdef DEBUG_WOLFSSL
+ wolfSSL_Debugging_OFF();
+#endif
+#ifdef CONFIG_IDF_TARGET_ESP32H2
+ ESP_LOGE(TAG, "No WiFi on the ESP32-H2 and ethernet not yet supported");
+ while (1) {
+ vTaskDelay(60000);
+ }
#endif
-
/* Set time for cert validation.
* Some lwIP APIs, including SNTP functions, are not thread safe. */
ret = set_time(); /* need to setup NTP before WiFi */
@@ -116,11 +124,23 @@ void app_main(void)
/* Initialize NVS */
ret = nvs_flash_init();
- if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
- ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
- ESP_ERROR_CHECK(nvs_flash_erase());
- ret = nvs_flash_init();
+ #if defined(CONFIG_IDF_TARGET_ESP8266)
+ {
+ if (ret == ESP_ERR_NVS_NO_FREE_PAGES) {
+ ESP_ERROR_CHECK(nvs_flash_erase());
+ ret = nvs_flash_init();
+ }
}
+ #else
+ {
+ /* Non-ESP8266 initialization is slightly different */
+ if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
+ ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
+ ESP_ERROR_CHECK(nvs_flash_erase());
+ ret = nvs_flash_init();
+ }
+ }
+ #endif /* else not CONFIG_IDF_TARGET_ESP8266 */
ESP_ERROR_CHECK(ret);
#if defined(CONFIG_IDF_TARGET_ESP32H2)
@@ -135,11 +155,11 @@ void app_main(void)
ESP_LOGI(TAG, "Trying WiFi again...");
ret = wifi_init_sta();
}
- #endif
-#endif
+ #endif /* else not CONFIG_IDF_TARGET_ESP32H2 */
+#endif /* else FOUND_PROTOCOL_EXAMPLES_DIR not found */
/* Once we are connected to the network, start & wait for NTP time */
- // ret = set_time_wait_for_ntp();
+ ret = set_time_wait_for_ntp();
if (ret < -1) {
/* a value of -1 means there was no NTP server, so no need to wait */
@@ -162,23 +182,16 @@ void app_main(void)
memset(&args, 0, sizeof(func_args));
echoserver_test(&args);
- ESP_LOGI(TAG, "\n\nDone!"
- "If running from idf.py monitor, press twice: Ctrl+]");
-
- ESP_LOGV(TAG, "\n\nLoop...\n\n");
ESP_LOGI(TAG, "Stack used: %d", CONFIG_ESP_MAIN_TASK_STACK_SIZE
- uxTaskGetStackHighWaterMark(NULL));
- while (1) {
-#if defined(SINGLE_THREADED)
- while (1);
-#else
- vTaskDelay(60000);
-#endif
- }
-
ESP_LOGI(TAG, "\n\nDone!\n\n"
"If running from idf.py monitor, press twice: Ctrl+]\n\n"
"WOLFSSL_COMPLETE\n" /* exit keyword for wolfssl_monitor.py */
);
+
+ while (1) {
+ vTaskDelay(60000);
+ }
+
} /* app_main */
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/time_helper.c b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/time_helper.c
index 09174d7c..012aa10c 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/time_helper.c
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/time_helper.c
@@ -1,6 +1,6 @@
/* time_helper.c
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/wifi_connect.c b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/wifi_connect.c
index 973eb4ff..992f83ca 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/wifi_connect.c
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/main/wifi_connect.c
@@ -1,6 +1,6 @@
/* wifi_connect.c
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/sdkconfi.old b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/sdkconfi.old
new file mode 100644
index 00000000..6d6d5124
--- /dev/null
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver/sdkconfi.old
@@ -0,0 +1,2244 @@
+#
+# Automatically generated file. DO NOT EDIT.
+# Espressif IoT Development Framework (ESP-IDF) 5.4.0 Project Configuration
+#
+CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined"
+CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined"
+CONFIG_SOC_DPORT_WORKAROUND="Not determined"
+CONFIG_SOC_CAPS_ECO_VER_MAX=301
+CONFIG_SOC_ADC_SUPPORTED=y
+CONFIG_SOC_DAC_SUPPORTED=y
+CONFIG_SOC_UART_SUPPORTED=y
+CONFIG_SOC_MCPWM_SUPPORTED=y
+CONFIG_SOC_GPTIMER_SUPPORTED=y
+CONFIG_SOC_SDMMC_HOST_SUPPORTED=y
+CONFIG_SOC_BT_SUPPORTED=y
+CONFIG_SOC_PCNT_SUPPORTED=y
+CONFIG_SOC_PHY_SUPPORTED=y
+CONFIG_SOC_WIFI_SUPPORTED=y
+CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y
+CONFIG_SOC_TWAI_SUPPORTED=y
+CONFIG_SOC_EFUSE_SUPPORTED=y
+CONFIG_SOC_EMAC_SUPPORTED=y
+CONFIG_SOC_ULP_SUPPORTED=y
+CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y
+CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y
+CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y
+CONFIG_SOC_RTC_MEM_SUPPORTED=y
+CONFIG_SOC_I2S_SUPPORTED=y
+CONFIG_SOC_RMT_SUPPORTED=y
+CONFIG_SOC_SDM_SUPPORTED=y
+CONFIG_SOC_GPSPI_SUPPORTED=y
+CONFIG_SOC_LEDC_SUPPORTED=y
+CONFIG_SOC_I2C_SUPPORTED=y
+CONFIG_SOC_SUPPORT_COEXISTENCE=y
+CONFIG_SOC_AES_SUPPORTED=y
+CONFIG_SOC_MPI_SUPPORTED=y
+CONFIG_SOC_SHA_SUPPORTED=y
+CONFIG_SOC_FLASH_ENC_SUPPORTED=y
+CONFIG_SOC_SECURE_BOOT_SUPPORTED=y
+CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y
+CONFIG_SOC_BOD_SUPPORTED=y
+CONFIG_SOC_ULP_FSM_SUPPORTED=y
+CONFIG_SOC_CLK_TREE_SUPPORTED=y
+CONFIG_SOC_MPU_SUPPORTED=y
+CONFIG_SOC_WDT_SUPPORTED=y
+CONFIG_SOC_SPI_FLASH_SUPPORTED=y
+CONFIG_SOC_RNG_SUPPORTED=y
+CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y
+CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y
+CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y
+CONFIG_SOC_PM_SUPPORTED=y
+CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5
+CONFIG_SOC_XTAL_SUPPORT_26M=y
+CONFIG_SOC_XTAL_SUPPORT_40M=y
+CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y
+CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y
+CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y
+CONFIG_SOC_ADC_DMA_SUPPORTED=y
+CONFIG_SOC_ADC_PERIPH_NUM=2
+CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10
+CONFIG_SOC_ADC_ATTEN_NUM=4
+CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2
+CONFIG_SOC_ADC_PATT_LEN_MAX=16
+CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9
+CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12
+CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2
+CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4
+CONFIG_SOC_ADC_DIGI_MONITOR_NUM=0
+CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2
+CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20
+CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9
+CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12
+CONFIG_SOC_ADC_SHARED_POWER=y
+CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y
+CONFIG_SOC_IDCACHE_PER_CORE=y
+CONFIG_SOC_CPU_CORES_NUM=2
+CONFIG_SOC_CPU_INTR_NUM=32
+CONFIG_SOC_CPU_HAS_FPU=y
+CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y
+CONFIG_SOC_CPU_BREAKPOINTS_NUM=2
+CONFIG_SOC_CPU_WATCHPOINTS_NUM=2
+CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=64
+CONFIG_SOC_DAC_CHAN_NUM=2
+CONFIG_SOC_DAC_RESOLUTION=8
+CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y
+CONFIG_SOC_GPIO_PORT=1
+CONFIG_SOC_GPIO_PIN_COUNT=40
+CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF
+CONFIG_SOC_GPIO_IN_RANGE_MAX=39
+CONFIG_SOC_GPIO_OUT_RANGE_MAX=33
+CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA
+CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y
+CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3
+CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y
+CONFIG_SOC_I2C_NUM=2
+CONFIG_SOC_HP_I2C_NUM=2
+CONFIG_SOC_I2C_FIFO_LEN=32
+CONFIG_SOC_I2C_CMD_REG_NUM=16
+CONFIG_SOC_I2C_SUPPORT_SLAVE=y
+CONFIG_SOC_I2C_SUPPORT_APB=y
+CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y
+CONFIG_SOC_I2C_STOP_INDEPENDENT=y
+CONFIG_SOC_I2S_NUM=2
+CONFIG_SOC_I2S_HW_VERSION_1=y
+CONFIG_SOC_I2S_SUPPORTS_APLL=y
+CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y
+CONFIG_SOC_I2S_SUPPORTS_PDM=y
+CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y
+CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1
+CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y
+CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1
+CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y
+CONFIG_SOC_I2S_SUPPORTS_ADC=y
+CONFIG_SOC_I2S_SUPPORTS_DAC=y
+CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y
+CONFIG_SOC_I2S_MAX_DATA_WIDTH=24
+CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y
+CONFIG_SOC_I2S_LCD_I80_VARIANT=y
+CONFIG_SOC_LCD_I80_SUPPORTED=y
+CONFIG_SOC_LCD_I80_BUSES=2
+CONFIG_SOC_LCD_I80_BUS_WIDTH=24
+CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y
+CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y
+CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y
+CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y
+CONFIG_SOC_LEDC_TIMER_NUM=4
+CONFIG_SOC_LEDC_CHANNEL_NUM=8
+CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20
+CONFIG_SOC_MCPWM_GROUPS=2
+CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3
+CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3
+CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2
+CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2
+CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2
+CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3
+CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y
+CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3
+CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3
+CONFIG_SOC_MMU_PERIPH_NUM=2
+CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3
+CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000
+CONFIG_SOC_MPU_REGIONS_MAX_NUM=8
+CONFIG_SOC_PCNT_GROUPS=1
+CONFIG_SOC_PCNT_UNITS_PER_GROUP=8
+CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2
+CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2
+CONFIG_SOC_RMT_GROUPS=1
+CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8
+CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8
+CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8
+CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64
+CONFIG_SOC_RMT_SUPPORT_REF_TICK=y
+CONFIG_SOC_RMT_SUPPORT_APB=y
+CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y
+CONFIG_SOC_RTCIO_PIN_COUNT=18
+CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y
+CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y
+CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y
+CONFIG_SOC_SDM_GROUPS=1
+CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8
+CONFIG_SOC_SDM_CLK_SUPPORT_APB=y
+CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y
+CONFIG_SOC_SPI_AS_CS_SUPPORTED=y
+CONFIG_SOC_SPI_PERIPH_NUM=3
+CONFIG_SOC_SPI_DMA_CHAN_NUM=2
+CONFIG_SOC_SPI_MAX_CS_NUM=3
+CONFIG_SOC_SPI_SUPPORT_CLK_APB=y
+CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64
+CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192
+CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y
+CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y
+CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y
+CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y
+CONFIG_SOC_TIMER_GROUPS=2
+CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2
+CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64
+CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4
+CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y
+CONFIG_SOC_TOUCH_SENSOR_VERSION=1
+CONFIG_SOC_TOUCH_SENSOR_NUM=10
+CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1
+CONFIG_SOC_TWAI_CONTROLLER_NUM=1
+CONFIG_SOC_TWAI_BRP_MIN=2
+CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y
+CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y
+CONFIG_SOC_UART_NUM=3
+CONFIG_SOC_UART_HP_NUM=3
+CONFIG_SOC_UART_SUPPORT_APB_CLK=y
+CONFIG_SOC_UART_SUPPORT_REF_TICK=y
+CONFIG_SOC_UART_FIFO_LEN=128
+CONFIG_SOC_UART_BITRATE_MAX=5000000
+CONFIG_SOC_SPIRAM_SUPPORTED=y
+CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y
+CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y
+CONFIG_SOC_SHA_ENDIANNESS_BE=y
+CONFIG_SOC_SHA_SUPPORT_SHA1=y
+CONFIG_SOC_SHA_SUPPORT_SHA256=y
+CONFIG_SOC_SHA_SUPPORT_SHA384=y
+CONFIG_SOC_SHA_SUPPORT_SHA512=y
+CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4
+CONFIG_SOC_MPI_OPERATIONS_NUM=y
+CONFIG_SOC_RSA_MAX_BIT_LEN=4096
+CONFIG_SOC_AES_SUPPORT_AES_128=y
+CONFIG_SOC_AES_SUPPORT_AES_192=y
+CONFIG_SOC_AES_SUPPORT_AES_256=y
+CONFIG_SOC_SECURE_BOOT_V1=y
+CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=y
+CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32
+CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21
+CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y
+CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y
+CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y
+CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y
+CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y
+CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y
+CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y
+CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y
+CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y
+CONFIG_SOC_PM_SUPPORT_MODEM_PD=y
+CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y
+CONFIG_SOC_PM_MODEM_PD_BY_SW=y
+CONFIG_SOC_CLK_APLL_SUPPORTED=y
+CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y
+CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y
+CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y
+CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y
+CONFIG_SOC_SDMMC_USE_IOMUX=y
+CONFIG_SOC_SDMMC_NUM_SLOTS=2
+CONFIG_SOC_WIFI_WAPI_SUPPORT=y
+CONFIG_SOC_WIFI_CSI_SUPPORT=y
+CONFIG_SOC_WIFI_MESH_SUPPORT=y
+CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y
+CONFIG_SOC_WIFI_NAN_SUPPORT=y
+CONFIG_SOC_BLE_SUPPORTED=y
+CONFIG_SOC_BLE_MESH_SUPPORTED=y
+CONFIG_SOC_BT_CLASSIC_SUPPORTED=y
+CONFIG_SOC_BLUFI_SUPPORTED=y
+CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED=y
+CONFIG_SOC_ULP_HAS_ADC=y
+CONFIG_SOC_PHY_COMBO_MODULE=y
+CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK=y
+CONFIG_IDF_CMAKE=y
+CONFIG_IDF_TOOLCHAIN="gcc"
+CONFIG_IDF_TOOLCHAIN_GCC=y
+CONFIG_IDF_TARGET_ARCH_XTENSA=y
+CONFIG_IDF_TARGET_ARCH="xtensa"
+CONFIG_IDF_TARGET="esp32"
+CONFIG_IDF_INIT_VERSION="5.2.0"
+CONFIG_IDF_TARGET_ESP32=y
+CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000
+
+#
+# Build type
+#
+CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y
+# CONFIG_APP_BUILD_TYPE_RAM is not set
+CONFIG_APP_BUILD_GENERATE_BINARIES=y
+CONFIG_APP_BUILD_BOOTLOADER=y
+CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y
+# CONFIG_APP_REPRODUCIBLE_BUILD is not set
+# CONFIG_APP_NO_BLOBS is not set
+# CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set
+# CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set
+# end of Build type
+
+#
+# Bootloader config
+#
+
+#
+# Bootloader manager
+#
+CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y
+CONFIG_BOOTLOADER_PROJECT_VER=1
+# end of Bootloader manager
+
+CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000
+CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y
+# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set
+# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set
+# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set
+
+#
+# Log
+#
+# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
+CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y
+# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
+CONFIG_BOOTLOADER_LOG_LEVEL=3
+
+#
+# Format
+#
+CONFIG_BOOTLOADER_LOG_COLORS=y
+CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y
+# end of Format
+# end of Log
+
+#
+# Serial Flash Configurations
+#
+# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set
+CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y
+# end of Serial Flash Configurations
+
+# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set
+CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y
+# CONFIG_BOOTLOADER_FACTORY_RESET is not set
+# CONFIG_BOOTLOADER_APP_TEST is not set
+CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y
+CONFIG_BOOTLOADER_WDT_ENABLE=y
+# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set
+CONFIG_BOOTLOADER_WDT_TIME_MS=9000
+# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set
+# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set
+# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set
+# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set
+CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0
+# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set
+# end of Bootloader config
+
+#
+# Security features
+#
+CONFIG_SECURE_BOOT_V1_SUPPORTED=y
+# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set
+# CONFIG_SECURE_BOOT is not set
+# CONFIG_SECURE_FLASH_ENC_ENABLED is not set
+# end of Security features
+
+#
+# Application manager
+#
+CONFIG_APP_COMPILE_TIME_DATE=y
+# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set
+# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set
+# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set
+CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9
+# end of Application manager
+
+CONFIG_ESP_ROM_HAS_CRC_LE=y
+CONFIG_ESP_ROM_HAS_CRC_BE=y
+CONFIG_ESP_ROM_HAS_MZ_CRC32=y
+CONFIG_ESP_ROM_HAS_JPEG_DECODE=y
+CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y
+CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y
+CONFIG_ESP_ROM_HAS_NEWLIB=y
+CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y
+CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y
+CONFIG_ESP_ROM_HAS_SW_FLOAT=y
+CONFIG_ESP_ROM_USB_OTG_NUM=-1
+CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=-1
+CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y
+CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y
+
+#
+# Serial flasher config
+#
+# CONFIG_ESPTOOLPY_NO_STUB is not set
+# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set
+# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set
+CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
+# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set
+CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y
+CONFIG_ESPTOOLPY_FLASHMODE="dio"
+# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set
+CONFIG_ESPTOOLPY_FLASHFREQ_40M=y
+# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set
+# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set
+CONFIG_ESPTOOLPY_FLASHFREQ="40m"
+# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set
+CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y
+# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set
+CONFIG_ESPTOOLPY_FLASHSIZE="2MB"
+# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set
+CONFIG_ESPTOOLPY_BEFORE_RESET=y
+# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set
+CONFIG_ESPTOOLPY_BEFORE="default_reset"
+CONFIG_ESPTOOLPY_AFTER_RESET=y
+# CONFIG_ESPTOOLPY_AFTER_NORESET is not set
+CONFIG_ESPTOOLPY_AFTER="hard_reset"
+CONFIG_ESPTOOLPY_MONITOR_BAUD=115200
+# end of Serial flasher config
+
+#
+# Partition Table
+#
+# CONFIG_PARTITION_TABLE_SINGLE_APP is not set
+CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y
+# CONFIG_PARTITION_TABLE_TWO_OTA is not set
+# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set
+# CONFIG_PARTITION_TABLE_CUSTOM is not set
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
+CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp_large.csv"
+CONFIG_PARTITION_TABLE_OFFSET=0x8000
+CONFIG_PARTITION_TABLE_MD5=y
+# end of Partition Table
+
+#
+# Example Connection Configuration
+#
+CONFIG_ENV_GPIO_RANGE_MIN=0
+CONFIG_ENV_GPIO_RANGE_MAX=39
+CONFIG_ENV_GPIO_IN_RANGE_MAX=39
+CONFIG_ENV_GPIO_OUT_RANGE_MAX=33
+CONFIG_EXAMPLE_CONNECT_WIFI=y
+# CONFIG_EXAMPLE_WIFI_SSID_PWD_FROM_STDIN is not set
+CONFIG_EXAMPLE_PROVIDE_WIFI_CONSOLE_CMD=y
+CONFIG_EXAMPLE_WIFI_SSID="badger"
+CONFIG_EXAMPLE_WIFI_PASSWORD="9X-*MyD2.MpGm8ibfQfp!crj."
+CONFIG_EXAMPLE_WIFI_CONN_MAX_RETRY=6
+# CONFIG_EXAMPLE_WIFI_SCAN_METHOD_FAST is not set
+CONFIG_EXAMPLE_WIFI_SCAN_METHOD_ALL_CHANNEL=y
+
+#
+# WiFi Scan threshold
+#
+CONFIG_EXAMPLE_WIFI_SCAN_RSSI_THRESHOLD=-127
+CONFIG_EXAMPLE_WIFI_AUTH_OPEN=y
+# CONFIG_EXAMPLE_WIFI_AUTH_WEP is not set
+# CONFIG_EXAMPLE_WIFI_AUTH_WPA_PSK is not set
+# CONFIG_EXAMPLE_WIFI_AUTH_WPA2_PSK is not set
+# CONFIG_EXAMPLE_WIFI_AUTH_WPA_WPA2_PSK is not set
+# CONFIG_EXAMPLE_WIFI_AUTH_WPA2_ENTERPRISE is not set
+# CONFIG_EXAMPLE_WIFI_AUTH_WPA3_PSK is not set
+# CONFIG_EXAMPLE_WIFI_AUTH_WPA2_WPA3_PSK is not set
+# CONFIG_EXAMPLE_WIFI_AUTH_WAPI_PSK is not set
+# end of WiFi Scan threshold
+
+CONFIG_EXAMPLE_WIFI_CONNECT_AP_BY_SIGNAL=y
+# CONFIG_EXAMPLE_WIFI_CONNECT_AP_BY_SECURITY is not set
+# CONFIG_EXAMPLE_CONNECT_ETHERNET is not set
+# CONFIG_EXAMPLE_CONNECT_PPP is not set
+CONFIG_EXAMPLE_CONNECT_IPV4=y
+CONFIG_EXAMPLE_CONNECT_IPV6=y
+CONFIG_EXAMPLE_CONNECT_IPV6_PREF_LOCAL_LINK=y
+# CONFIG_EXAMPLE_CONNECT_IPV6_PREF_GLOBAL is not set
+# CONFIG_EXAMPLE_CONNECT_IPV6_PREF_SITE_LOCAL is not set
+# CONFIG_EXAMPLE_CONNECT_IPV6_PREF_UNIQUE_LOCAL is not set
+# end of Example Connection Configuration
+
+#
+# Compiler options
+#
+CONFIG_COMPILER_OPTIMIZATION_DEBUG=y
+# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set
+# CONFIG_COMPILER_OPTIMIZATION_PERF is not set
+# CONFIG_COMPILER_OPTIMIZATION_NONE is not set
+CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y
+# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set
+# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set
+CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y
+CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y
+CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2
+# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set
+CONFIG_COMPILER_HIDE_PATHS_MACROS=y
+# CONFIG_COMPILER_CXX_EXCEPTIONS is not set
+# CONFIG_COMPILER_CXX_RTTI is not set
+# CONFIG_COMPILER_STACK_CHECK_MODE_NONE is not set
+CONFIG_COMPILER_STACK_CHECK_MODE_NORM=y
+# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set
+# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set
+CONFIG_COMPILER_STACK_CHECK=y
+# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set
+# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set
+CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y
+# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set
+# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set
+# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set
+# CONFIG_COMPILER_DUMP_RTL_FILES is not set
+CONFIG_COMPILER_RT_LIB_GCCLIB=y
+CONFIG_COMPILER_RT_LIB_NAME="gcc"
+CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y
+# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set
+# CONFIG_COMPILER_STATIC_ANALYZER is not set
+# end of Compiler options
+
+#
+# Component config
+#
+
+#
+# Application Level Tracing
+#
+# CONFIG_APPTRACE_DEST_JTAG is not set
+CONFIG_APPTRACE_DEST_NONE=y
+# CONFIG_APPTRACE_DEST_UART1 is not set
+# CONFIG_APPTRACE_DEST_UART2 is not set
+CONFIG_APPTRACE_DEST_UART_NONE=y
+CONFIG_APPTRACE_UART_TASK_PRIO=1
+CONFIG_APPTRACE_LOCK_ENABLE=y
+# end of Application Level Tracing
+
+#
+# Bluetooth
+#
+# CONFIG_BT_ENABLED is not set
+CONFIG_BT_ALARM_MAX_NUM=50
+# end of Bluetooth
+
+#
+# Console Library
+#
+# CONFIG_CONSOLE_SORTED_HELP is not set
+# end of Console Library
+
+#
+# Driver Configurations
+#
+
+#
+# TWAI Configuration
+#
+# CONFIG_TWAI_ISR_IN_IRAM is not set
+CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC=y
+CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST=y
+CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID=y
+CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT=y
+CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y
+# end of TWAI Configuration
+
+#
+# Legacy ADC Driver Configuration
+#
+CONFIG_ADC_DISABLE_DAC=y
+# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set
+# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set
+
+#
+# Legacy ADC Calibration Configuration
+#
+CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y
+CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y
+CONFIG_ADC_CAL_LUT_ENABLE=y
+# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set
+# end of Legacy ADC Calibration Configuration
+# end of Legacy ADC Driver Configuration
+
+#
+# Legacy DAC Driver Configurations
+#
+# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set
+# CONFIG_DAC_SKIP_LEGACY_CONFLICT_CHECK is not set
+# end of Legacy DAC Driver Configurations
+
+#
+# Legacy MCPWM Driver Configurations
+#
+# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set
+# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set
+# end of Legacy MCPWM Driver Configurations
+
+#
+# Legacy Timer Group Driver Configurations
+#
+# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set
+# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set
+# end of Legacy Timer Group Driver Configurations
+
+#
+# Legacy RMT Driver Configurations
+#
+# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set
+# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set
+# end of Legacy RMT Driver Configurations
+
+#
+# Legacy I2S Driver Configurations
+#
+# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set
+# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set
+# end of Legacy I2S Driver Configurations
+
+#
+# Legacy PCNT Driver Configurations
+#
+# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set
+# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set
+# end of Legacy PCNT Driver Configurations
+
+#
+# Legacy SDM Driver Configurations
+#
+# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set
+# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set
+# end of Legacy SDM Driver Configurations
+# end of Driver Configurations
+
+#
+# eFuse Bit Manager
+#
+# CONFIG_EFUSE_CUSTOM_TABLE is not set
+# CONFIG_EFUSE_VIRTUAL is not set
+# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set
+CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y
+# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set
+CONFIG_EFUSE_MAX_BLK_LEN=192
+# end of eFuse Bit Manager
+
+#
+# ESP-TLS
+#
+CONFIG_ESP_TLS_USING_MBEDTLS=y
+# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set
+# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set
+# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set
+# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set
+# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set
+# CONFIG_ESP_TLS_PSK_VERIFICATION is not set
+# CONFIG_ESP_TLS_INSECURE is not set
+# end of ESP-TLS
+
+#
+# ADC and ADC Calibration
+#
+# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set
+
+#
+# ADC Calibration Configurations
+#
+CONFIG_ADC_CALI_EFUSE_TP_ENABLE=y
+CONFIG_ADC_CALI_EFUSE_VREF_ENABLE=y
+CONFIG_ADC_CALI_LUT_ENABLE=y
+# end of ADC Calibration Configurations
+
+CONFIG_ADC_DISABLE_DAC_OUTPUT=y
+# CONFIG_ADC_ENABLE_DEBUG_LOG is not set
+# end of ADC and ADC Calibration
+
+#
+# Wireless Coexistence
+#
+CONFIG_ESP_COEX_ENABLED=y
+# CONFIG_ESP_COEX_GPIO_DEBUG is not set
+# end of Wireless Coexistence
+
+#
+# Common ESP-related
+#
+CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
+# end of Common ESP-related
+
+#
+# ESP-Driver:DAC Configurations
+#
+# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_DAC_ISR_IRAM_SAFE is not set
+# CONFIG_DAC_ENABLE_DEBUG_LOG is not set
+CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y
+# end of ESP-Driver:DAC Configurations
+
+#
+# ESP-Driver:GPIO Configurations
+#
+# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set
+# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set
+# end of ESP-Driver:GPIO Configurations
+
+#
+# ESP-Driver:GPTimer Configurations
+#
+CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y
+# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set
+# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:GPTimer Configurations
+
+#
+# ESP-Driver:I2C Configurations
+#
+# CONFIG_I2C_ISR_IRAM_SAFE is not set
+# CONFIG_I2C_ENABLE_DEBUG_LOG is not set
+# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set
+# end of ESP-Driver:I2C Configurations
+
+#
+# ESP-Driver:I2S Configurations
+#
+# CONFIG_I2S_ISR_IRAM_SAFE is not set
+# CONFIG_I2S_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:I2S Configurations
+
+#
+# ESP-Driver:LEDC Configurations
+#
+# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set
+# end of ESP-Driver:LEDC Configurations
+
+#
+# ESP-Driver:MCPWM Configurations
+#
+# CONFIG_MCPWM_ISR_IRAM_SAFE is not set
+# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:MCPWM Configurations
+
+#
+# ESP-Driver:PCNT Configurations
+#
+# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_PCNT_ISR_IRAM_SAFE is not set
+# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:PCNT Configurations
+
+#
+# ESP-Driver:RMT Configurations
+#
+# CONFIG_RMT_ISR_IRAM_SAFE is not set
+# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set
+# CONFIG_RMT_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:RMT Configurations
+
+#
+# ESP-Driver:Sigma Delta Modulator Configurations
+#
+# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_SDM_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:Sigma Delta Modulator Configurations
+
+#
+# ESP-Driver:SPI Configurations
+#
+# CONFIG_SPI_MASTER_IN_IRAM is not set
+CONFIG_SPI_MASTER_ISR_IN_IRAM=y
+# CONFIG_SPI_SLAVE_IN_IRAM is not set
+CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
+# end of ESP-Driver:SPI Configurations
+
+#
+# ESP-Driver:Touch Sensor Configurations
+#
+# CONFIG_TOUCH_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_TOUCH_ISR_IRAM_SAFE is not set
+# CONFIG_TOUCH_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:Touch Sensor Configurations
+
+#
+# ESP-Driver:UART Configurations
+#
+# CONFIG_UART_ISR_IN_IRAM is not set
+# end of ESP-Driver:UART Configurations
+
+#
+# Ethernet
+#
+CONFIG_ETH_ENABLED=y
+CONFIG_ETH_USE_ESP32_EMAC=y
+CONFIG_ETH_PHY_INTERFACE_RMII=y
+CONFIG_ETH_RMII_CLK_INPUT=y
+# CONFIG_ETH_RMII_CLK_OUTPUT is not set
+CONFIG_ETH_RMII_CLK_IN_GPIO=0
+CONFIG_ETH_DMA_BUFFER_SIZE=512
+CONFIG_ETH_DMA_RX_BUFFER_NUM=10
+CONFIG_ETH_DMA_TX_BUFFER_NUM=10
+# CONFIG_ETH_IRAM_OPTIMIZATION is not set
+CONFIG_ETH_USE_SPI_ETHERNET=y
+# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set
+# CONFIG_ETH_SPI_ETHERNET_W5500 is not set
+# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set
+# CONFIG_ETH_USE_OPENETH is not set
+# CONFIG_ETH_TRANSMIT_MUTEX is not set
+# end of Ethernet
+
+#
+# Event Loop Library
+#
+# CONFIG_ESP_EVENT_LOOP_PROFILING is not set
+CONFIG_ESP_EVENT_POST_FROM_ISR=y
+CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y
+# end of Event Loop Library
+
+#
+# GDB Stub
+#
+CONFIG_ESP_GDBSTUB_ENABLED=y
+# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set
+CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y
+CONFIG_ESP_GDBSTUB_MAX_TASKS=32
+# end of GDB Stub
+
+#
+# ESP HTTP client
+#
+CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y
+# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set
+# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set
+# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set
+CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000
+# end of ESP HTTP client
+
+#
+# HTTP Server
+#
+CONFIG_HTTPD_MAX_REQ_HDR_LEN=512
+CONFIG_HTTPD_MAX_URI_LEN=512
+CONFIG_HTTPD_ERR_RESP_NO_DELAY=y
+CONFIG_HTTPD_PURGE_BUF_LEN=32
+# CONFIG_HTTPD_LOG_PURGE_DATA is not set
+# CONFIG_HTTPD_WS_SUPPORT is not set
+# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set
+CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000
+# end of HTTP Server
+
+#
+# ESP HTTPS OTA
+#
+# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set
+# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set
+CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000
+# end of ESP HTTPS OTA
+
+#
+# ESP HTTPS server
+#
+# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set
+CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000
+# end of ESP HTTPS server
+
+#
+# Hardware Settings
+#
+
+#
+# Chip revision
+#
+CONFIG_ESP32_REV_MIN_0=y
+# CONFIG_ESP32_REV_MIN_1 is not set
+# CONFIG_ESP32_REV_MIN_1_1 is not set
+# CONFIG_ESP32_REV_MIN_2 is not set
+# CONFIG_ESP32_REV_MIN_3 is not set
+# CONFIG_ESP32_REV_MIN_3_1 is not set
+CONFIG_ESP32_REV_MIN=0
+CONFIG_ESP32_REV_MIN_FULL=0
+CONFIG_ESP_REV_MIN_FULL=0
+
+#
+# Maximum Supported ESP32 Revision (Rev v3.99)
+#
+CONFIG_ESP32_REV_MAX_FULL=399
+CONFIG_ESP_REV_MAX_FULL=399
+CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0
+CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99
+
+#
+# Maximum Supported ESP32 eFuse Block Revision (eFuse Block Rev v0.99)
+#
+# end of Chip revision
+
+#
+# MAC Config
+#
+CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y
+CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y
+CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y
+CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y
+CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y
+CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4
+# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set
+CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y
+CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4
+# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set
+# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set
+# end of MAC Config
+
+#
+# Sleep Config
+#
+# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set
+CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y
+# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set
+CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y
+# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set
+CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000
+# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set
+# CONFIG_ESP_SLEEP_DEBUG is not set
+CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y
+# end of Sleep Config
+
+#
+# RTC Clock Config
+#
+CONFIG_RTC_CLK_SRC_INT_RC=y
+# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set
+# CONFIG_RTC_CLK_SRC_EXT_OSC is not set
+# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set
+CONFIG_RTC_CLK_CAL_CYCLES=1024
+# end of RTC Clock Config
+
+#
+# Peripheral Control
+#
+CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y
+# end of Peripheral Control
+
+#
+# Main XTAL Config
+#
+# CONFIG_XTAL_FREQ_26 is not set
+# CONFIG_XTAL_FREQ_32 is not set
+CONFIG_XTAL_FREQ_40=y
+# CONFIG_XTAL_FREQ_AUTO is not set
+CONFIG_XTAL_FREQ=40
+# end of Main XTAL Config
+
+CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y
+# end of Hardware Settings
+
+#
+# ESP-Driver:LCD Controller Configurations
+#
+# CONFIG_LCD_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:LCD Controller Configurations
+
+#
+# ESP-MM: Memory Management Configurations
+#
+# end of ESP-MM: Memory Management Configurations
+
+#
+# ESP NETIF Adapter
+#
+CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120
+# CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION is not set
+CONFIG_ESP_NETIF_TCPIP_LWIP=y
+# CONFIG_ESP_NETIF_LOOPBACK is not set
+CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y
+CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC=y
+# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set
+# CONFIG_ESP_NETIF_L2_TAP is not set
+# CONFIG_ESP_NETIF_BRIDGE_EN is not set
+# CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF is not set
+# end of ESP NETIF Adapter
+
+#
+# Partition API Configuration
+#
+# end of Partition API Configuration
+
+#
+# PHY
+#
+CONFIG_ESP_PHY_ENABLED=y
+CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y
+# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set
+CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20
+CONFIG_ESP_PHY_MAX_TX_POWER=20
+# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set
+# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set
+CONFIG_ESP_PHY_RF_CAL_PARTIAL=y
+# CONFIG_ESP_PHY_RF_CAL_NONE is not set
+# CONFIG_ESP_PHY_RF_CAL_FULL is not set
+CONFIG_ESP_PHY_CALIBRATION_MODE=0
+# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set
+# CONFIG_ESP_PHY_RECORD_USED_TIME is not set
+# end of PHY
+
+#
+# Power Management
+#
+# CONFIG_PM_ENABLE is not set
+# CONFIG_PM_SLP_IRAM_OPT is not set
+# end of Power Management
+
+#
+# ESP PSRAM
+#
+# CONFIG_SPIRAM is not set
+# end of ESP PSRAM
+
+#
+# ESP Ringbuf
+#
+# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set
+# end of ESP Ringbuf
+
+#
+# ESP Security Specific
+#
+# end of ESP Security Specific
+
+#
+# ESP System Settings
+#
+# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set
+# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240
+
+#
+# Memory
+#
+# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set
+
+#
+# Non-backward compatible options
+#
+# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set
+# end of Non-backward compatible options
+# end of Memory
+
+#
+# Trace memory
+#
+# CONFIG_ESP32_TRAX is not set
+CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0
+# end of Trace memory
+
+# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set
+CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y
+# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set
+# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set
+CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0
+
+#
+# Memory protection
+#
+# end of Memory protection
+
+CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32
+CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304
+CONFIG_ESP_MAIN_TASK_STACK_SIZE=55500
+CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y
+# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set
+# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set
+CONFIG_ESP_MAIN_TASK_AFFINITY=0x0
+CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048
+CONFIG_ESP_CONSOLE_UART_DEFAULT=y
+# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set
+# CONFIG_ESP_CONSOLE_NONE is not set
+CONFIG_ESP_CONSOLE_UART=y
+CONFIG_ESP_CONSOLE_UART_NUM=0
+CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0
+CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200
+CONFIG_ESP_INT_WDT=y
+CONFIG_ESP_INT_WDT_TIMEOUT_MS=300
+CONFIG_ESP_INT_WDT_CHECK_CPU1=y
+CONFIG_ESP_TASK_WDT_EN=y
+CONFIG_ESP_TASK_WDT_INIT=y
+# CONFIG_ESP_TASK_WDT_PANIC is not set
+CONFIG_ESP_TASK_WDT_TIMEOUT_S=5
+CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
+CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
+# CONFIG_ESP_PANIC_HANDLER_IRAM is not set
+# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set
+CONFIG_ESP_DEBUG_OCDAWARE=y
+# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set
+CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y
+
+#
+# Brownout Detector
+#
+CONFIG_ESP_BROWNOUT_DET=y
+CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0=y
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set
+CONFIG_ESP_BROWNOUT_DET_LVL=0
+# end of Brownout Detector
+
+# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set
+CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y
+# end of ESP System Settings
+
+#
+# IPC (Inter-Processor Call)
+#
+CONFIG_ESP_IPC_TASK_STACK_SIZE=1024
+CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y
+CONFIG_ESP_IPC_ISR_ENABLE=y
+# end of IPC (Inter-Processor Call)
+
+#
+# ESP Timer (High Resolution Timer)
+#
+# CONFIG_ESP_TIMER_PROFILING is not set
+CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y
+CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y
+CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584
+CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1
+# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set
+CONFIG_ESP_TIMER_TASK_AFFINITY=0x0
+CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y
+CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y
+# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set
+CONFIG_ESP_TIMER_IMPL_TG0_LAC=y
+# end of ESP Timer (High Resolution Timer)
+
+#
+# Wi-Fi
+#
+CONFIG_ESP_WIFI_ENABLED=y
+CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10
+CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
+# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set
+CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y
+CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1
+CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32
+CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y
+# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set
+CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0
+CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5
+# CONFIG_ESP_WIFI_CSI_ENABLED is not set
+CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y
+CONFIG_ESP_WIFI_TX_BA_WIN=6
+CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
+CONFIG_ESP_WIFI_RX_BA_WIN=6
+CONFIG_ESP_WIFI_NVS_ENABLED=y
+CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y
+# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set
+CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752
+CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32
+CONFIG_ESP_WIFI_IRAM_OPT=y
+# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set
+CONFIG_ESP_WIFI_RX_IRAM_OPT=y
+CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y
+CONFIG_ESP_WIFI_ENABLE_SAE_PK=y
+CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y
+CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y
+# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set
+CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50
+CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10
+CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15
+CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y
+# CONFIG_ESP_WIFI_GMAC_SUPPORT is not set
+CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y
+# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set
+CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7
+# CONFIG_ESP_WIFI_NAN_ENABLE is not set
+CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y
+CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y
+# CONFIG_ESP_WIFI_WAPI_PSK is not set
+# CONFIG_ESP_WIFI_11KV_SUPPORT is not set
+# CONFIG_ESP_WIFI_MBO_SUPPORT is not set
+# CONFIG_ESP_WIFI_DPP_SUPPORT is not set
+# CONFIG_ESP_WIFI_11R_SUPPORT is not set
+# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set
+
+#
+# WPS Configuration Options
+#
+# CONFIG_ESP_WIFI_WPS_STRICT is not set
+# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set
+# end of WPS Configuration Options
+
+# CONFIG_ESP_WIFI_DEBUG_PRINT is not set
+# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set
+CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y
+# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set
+# end of Wi-Fi
+
+#
+# Core dump
+#
+# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set
+# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set
+CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y
+# end of Core dump
+
+#
+# FAT Filesystem support
+#
+CONFIG_FATFS_VOLUME_COUNT=2
+CONFIG_FATFS_LFN_NONE=y
+# CONFIG_FATFS_LFN_HEAP is not set
+# CONFIG_FATFS_LFN_STACK is not set
+# CONFIG_FATFS_SECTOR_512 is not set
+CONFIG_FATFS_SECTOR_4096=y
+# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set
+CONFIG_FATFS_CODEPAGE_437=y
+# CONFIG_FATFS_CODEPAGE_720 is not set
+# CONFIG_FATFS_CODEPAGE_737 is not set
+# CONFIG_FATFS_CODEPAGE_771 is not set
+# CONFIG_FATFS_CODEPAGE_775 is not set
+# CONFIG_FATFS_CODEPAGE_850 is not set
+# CONFIG_FATFS_CODEPAGE_852 is not set
+# CONFIG_FATFS_CODEPAGE_855 is not set
+# CONFIG_FATFS_CODEPAGE_857 is not set
+# CONFIG_FATFS_CODEPAGE_860 is not set
+# CONFIG_FATFS_CODEPAGE_861 is not set
+# CONFIG_FATFS_CODEPAGE_862 is not set
+# CONFIG_FATFS_CODEPAGE_863 is not set
+# CONFIG_FATFS_CODEPAGE_864 is not set
+# CONFIG_FATFS_CODEPAGE_865 is not set
+# CONFIG_FATFS_CODEPAGE_866 is not set
+# CONFIG_FATFS_CODEPAGE_869 is not set
+# CONFIG_FATFS_CODEPAGE_932 is not set
+# CONFIG_FATFS_CODEPAGE_936 is not set
+# CONFIG_FATFS_CODEPAGE_949 is not set
+# CONFIG_FATFS_CODEPAGE_950 is not set
+CONFIG_FATFS_CODEPAGE=437
+CONFIG_FATFS_FS_LOCK=0
+CONFIG_FATFS_TIMEOUT_MS=10000
+CONFIG_FATFS_PER_FILE_CACHE=y
+# CONFIG_FATFS_USE_FASTSEEK is not set
+CONFIG_FATFS_USE_STRFUNC_NONE=y
+# CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV is not set
+# CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV is not set
+CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0
+# CONFIG_FATFS_IMMEDIATE_FSYNC is not set
+# CONFIG_FATFS_USE_LABEL is not set
+CONFIG_FATFS_LINK_LOCK=y
+# end of FAT Filesystem support
+
+#
+# FreeRTOS
+#
+
+#
+# Kernel
+#
+# CONFIG_FREERTOS_SMP is not set
+# CONFIG_FREERTOS_UNICORE is not set
+CONFIG_FREERTOS_HZ=1000
+# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set
+# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set
+CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y
+CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1
+CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536
+# CONFIG_FREERTOS_USE_IDLE_HOOK is not set
+# CONFIG_FREERTOS_USE_TICK_HOOK is not set
+CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16
+# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set
+CONFIG_FREERTOS_USE_TIMERS=y
+CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc"
+# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set
+# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set
+CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y
+CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF
+CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1
+CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048
+CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10
+CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0
+CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1
+# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set
+# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set
+# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set
+# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set
+# end of Kernel
+
+#
+# Port
+#
+CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y
+# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set
+CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y
+# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set
+# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set
+CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y
+CONFIG_FREERTOS_ISR_STACKSIZE=1536
+CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y
+# CONFIG_FREERTOS_FPU_IN_ISR is not set
+CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y
+CONFIG_FREERTOS_CORETIMER_0=y
+# CONFIG_FREERTOS_CORETIMER_1 is not set
+CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y
+# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set
+# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set
+# end of Port
+
+#
+# Extra
+#
+# end of Extra
+
+CONFIG_FREERTOS_PORT=y
+CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF
+CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y
+CONFIG_FREERTOS_DEBUG_OCDAWARE=y
+CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y
+CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y
+CONFIG_FREERTOS_NUMBER_OF_CORES=2
+# end of FreeRTOS
+
+#
+# Hardware Abstraction Layer (HAL) and Low Level (LL)
+#
+CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y
+# CONFIG_HAL_ASSERTION_DISABLE is not set
+# CONFIG_HAL_ASSERTION_SILENT is not set
+# CONFIG_HAL_ASSERTION_ENABLE is not set
+CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2
+CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y
+CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y
+# CONFIG_HAL_ECDSA_GEN_SIG_CM is not set
+# end of Hardware Abstraction Layer (HAL) and Low Level (LL)
+
+#
+# Heap memory debugging
+#
+CONFIG_HEAP_POISONING_DISABLED=y
+# CONFIG_HEAP_POISONING_LIGHT is not set
+# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set
+CONFIG_HEAP_TRACING_OFF=y
+# CONFIG_HEAP_TRACING_STANDALONE is not set
+# CONFIG_HEAP_TRACING_TOHOST is not set
+# CONFIG_HEAP_USE_HOOKS is not set
+# CONFIG_HEAP_TASK_TRACKING is not set
+# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set
+# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set
+# end of Heap memory debugging
+
+#
+# Log
+#
+
+#
+# Log Level
+#
+# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set
+# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set
+# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set
+CONFIG_LOG_DEFAULT_LEVEL_INFO=y
+# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set
+# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set
+CONFIG_LOG_DEFAULT_LEVEL=3
+CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y
+# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set
+# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set
+CONFIG_LOG_MAXIMUM_LEVEL=3
+
+#
+# Level Settings
+#
+# CONFIG_LOG_MASTER_LEVEL is not set
+CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y
+# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set
+# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set
+CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y
+# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set
+CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y
+CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31
+# end of Level Settings
+# end of Log Level
+
+#
+# Format
+#
+CONFIG_LOG_COLORS=y
+CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y
+# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set
+# end of Format
+# end of Log
+
+#
+# LWIP
+#
+CONFIG_LWIP_ENABLE=y
+CONFIG_LWIP_LOCAL_HOSTNAME="espressif"
+# CONFIG_LWIP_NETIF_API is not set
+CONFIG_LWIP_TCPIP_TASK_PRIO=18
+# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set
+# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set
+CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
+# CONFIG_LWIP_L2_TO_L3_COPY is not set
+# CONFIG_LWIP_IRAM_OPTIMIZATION is not set
+# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set
+CONFIG_LWIP_TIMERS_ONDEMAND=y
+CONFIG_LWIP_ND6=y
+# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set
+CONFIG_LWIP_MAX_SOCKETS=10
+# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set
+# CONFIG_LWIP_SO_LINGER is not set
+CONFIG_LWIP_SO_REUSE=y
+CONFIG_LWIP_SO_REUSE_RXTOALL=y
+# CONFIG_LWIP_SO_RCVBUF is not set
+# CONFIG_LWIP_NETBUF_RECVINFO is not set
+CONFIG_LWIP_IP_DEFAULT_TTL=64
+CONFIG_LWIP_IP4_FRAG=y
+CONFIG_LWIP_IP6_FRAG=y
+# CONFIG_LWIP_IP4_REASSEMBLY is not set
+# CONFIG_LWIP_IP6_REASSEMBLY is not set
+CONFIG_LWIP_IP_REASS_MAX_PBUFS=10
+# CONFIG_LWIP_IP_FORWARD is not set
+# CONFIG_LWIP_STATS is not set
+CONFIG_LWIP_ESP_GRATUITOUS_ARP=y
+CONFIG_LWIP_GARP_TMR_INTERVAL=60
+CONFIG_LWIP_ESP_MLDV6_REPORT=y
+CONFIG_LWIP_MLDV6_TMR_INTERVAL=40
+CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32
+CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y
+# CONFIG_LWIP_DHCP_DOES_ACD_CHECK is not set
+# CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP is not set
+# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set
+CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y
+# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set
+CONFIG_LWIP_DHCP_OPTIONS_LEN=68
+CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0
+CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1
+
+#
+# DHCP server
+#
+CONFIG_LWIP_DHCPS=y
+CONFIG_LWIP_DHCPS_LEASE_UNIT=60
+CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8
+CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y
+CONFIG_LWIP_DHCPS_ADD_DNS=y
+# end of DHCP server
+
+# CONFIG_LWIP_AUTOIP is not set
+CONFIG_LWIP_IPV4=y
+CONFIG_LWIP_IPV6=y
+# CONFIG_LWIP_IPV6_AUTOCONFIG is not set
+CONFIG_LWIP_IPV6_NUM_ADDRESSES=3
+# CONFIG_LWIP_IPV6_FORWARD is not set
+# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set
+CONFIG_LWIP_NETIF_LOOPBACK=y
+CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8
+
+#
+# TCP
+#
+CONFIG_LWIP_MAX_ACTIVE_TCP=16
+CONFIG_LWIP_MAX_LISTENING_TCP=16
+CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y
+CONFIG_LWIP_TCP_MAXRTX=12
+CONFIG_LWIP_TCP_SYNMAXRTX=12
+CONFIG_LWIP_TCP_MSS=1440
+CONFIG_LWIP_TCP_TMR_INTERVAL=250
+CONFIG_LWIP_TCP_MSL=60000
+CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000
+CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744
+CONFIG_LWIP_TCP_WND_DEFAULT=5744
+CONFIG_LWIP_TCP_RECVMBOX_SIZE=6
+CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6
+CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
+CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6
+CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4
+# CONFIG_LWIP_TCP_SACK_OUT is not set
+CONFIG_LWIP_TCP_OVERSIZE_MSS=y
+# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set
+# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set
+CONFIG_LWIP_TCP_RTO_TIME=1500
+# end of TCP
+
+#
+# UDP
+#
+CONFIG_LWIP_MAX_UDP_PCBS=16
+CONFIG_LWIP_UDP_RECVMBOX_SIZE=6
+# end of UDP
+
+#
+# Checksums
+#
+# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set
+# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set
+CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y
+# end of Checksums
+
+CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072
+CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
+# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set
+# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set
+CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF
+CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3
+CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5
+CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5
+CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3
+CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10
+# CONFIG_LWIP_PPP_SUPPORT is not set
+# CONFIG_LWIP_SLIP_SUPPORT is not set
+
+#
+# ICMP
+#
+CONFIG_LWIP_ICMP=y
+# CONFIG_LWIP_MULTICAST_PING is not set
+# CONFIG_LWIP_BROADCAST_PING is not set
+# end of ICMP
+
+#
+# LWIP RAW API
+#
+CONFIG_LWIP_MAX_RAW_PCBS=16
+# end of LWIP RAW API
+
+#
+# SNTP
+#
+CONFIG_LWIP_SNTP_MAX_SERVERS=1
+# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set
+CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000
+CONFIG_LWIP_SNTP_STARTUP_DELAY=y
+CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000
+# end of SNTP
+
+#
+# DNS
+#
+CONFIG_LWIP_DNS_MAX_HOST_IP=1
+CONFIG_LWIP_DNS_MAX_SERVERS=3
+# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set
+# CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set
+# end of DNS
+
+CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7
+CONFIG_LWIP_ESP_LWIP_ASSERT=y
+
+#
+# Hooks
+#
+# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set
+CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y
+# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set
+CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y
+# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set
+# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set
+CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y
+# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set
+# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set
+CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y
+# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set
+# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set
+CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y
+# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set
+# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set
+CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE=y
+# CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM is not set
+CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y
+# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set
+# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set
+# end of Hooks
+
+# CONFIG_LWIP_DEBUG is not set
+# end of LWIP
+
+#
+# mbedTLS
+#
+CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
+# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set
+# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set
+CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
+CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
+CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
+# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set
+# CONFIG_MBEDTLS_DEBUG is not set
+
+#
+# mbedTLS v3.x related
+#
+# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set
+# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set
+# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set
+# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set
+CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y
+CONFIG_MBEDTLS_PKCS7_C=y
+# end of mbedTLS v3.x related
+
+#
+# Certificate Bundle
+#
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y
+# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set
+# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set
+# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set
+# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200
+# end of Certificate Bundle
+
+# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set
+CONFIG_MBEDTLS_CMAC_C=y
+CONFIG_MBEDTLS_HARDWARE_AES=y
+CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y
+CONFIG_MBEDTLS_HARDWARE_MPI=y
+# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set
+CONFIG_MBEDTLS_HARDWARE_SHA=y
+CONFIG_MBEDTLS_ROM_MD5=y
+# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set
+# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set
+CONFIG_MBEDTLS_HAVE_TIME=y
+# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set
+# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set
+CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y
+CONFIG_MBEDTLS_SHA512_C=y
+# CONFIG_MBEDTLS_SHA3_C is not set
+CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y
+# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set
+# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set
+# CONFIG_MBEDTLS_TLS_DISABLED is not set
+CONFIG_MBEDTLS_TLS_SERVER=y
+CONFIG_MBEDTLS_TLS_CLIENT=y
+CONFIG_MBEDTLS_TLS_ENABLED=y
+
+#
+# TLS Key Exchange Methods
+#
+# CONFIG_MBEDTLS_PSK_MODES is not set
+CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y
+# end of TLS Key Exchange Methods
+
+CONFIG_MBEDTLS_SSL_RENEGOTIATION=y
+CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y
+# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set
+# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set
+CONFIG_MBEDTLS_SSL_ALPN=y
+CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y
+CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y
+
+#
+# Symmetric Ciphers
+#
+CONFIG_MBEDTLS_AES_C=y
+# CONFIG_MBEDTLS_CAMELLIA_C is not set
+# CONFIG_MBEDTLS_DES_C is not set
+# CONFIG_MBEDTLS_BLOWFISH_C is not set
+# CONFIG_MBEDTLS_XTEA_C is not set
+CONFIG_MBEDTLS_CCM_C=y
+CONFIG_MBEDTLS_GCM_C=y
+# CONFIG_MBEDTLS_NIST_KW_C is not set
+# end of Symmetric Ciphers
+
+# CONFIG_MBEDTLS_RIPEMD160_C is not set
+
+#
+# Certificates
+#
+CONFIG_MBEDTLS_PEM_PARSE_C=y
+CONFIG_MBEDTLS_PEM_WRITE_C=y
+CONFIG_MBEDTLS_X509_CRL_PARSE_C=y
+CONFIG_MBEDTLS_X509_CSR_PARSE_C=y
+# end of Certificates
+
+CONFIG_MBEDTLS_ECP_C=y
+CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y
+CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y
+# CONFIG_MBEDTLS_DHM_C is not set
+CONFIG_MBEDTLS_ECDH_C=y
+CONFIG_MBEDTLS_ECDSA_C=y
+# CONFIG_MBEDTLS_ECJPAKE_C is not set
+CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
+CONFIG_MBEDTLS_ECP_NIST_OPTIM=y
+CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y
+# CONFIG_MBEDTLS_POLY1305_C is not set
+# CONFIG_MBEDTLS_CHACHA20_C is not set
+# CONFIG_MBEDTLS_HKDF_C is not set
+# CONFIG_MBEDTLS_THREADING_C is not set
+CONFIG_MBEDTLS_ERROR_STRINGS=y
+CONFIG_MBEDTLS_FS_IO=y
+# end of mbedTLS
+
+#
+# ESP-MQTT Configurations
+#
+CONFIG_MQTT_PROTOCOL_311=y
+# CONFIG_MQTT_PROTOCOL_5 is not set
+CONFIG_MQTT_TRANSPORT_SSL=y
+CONFIG_MQTT_TRANSPORT_WEBSOCKET=y
+CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y
+# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set
+# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set
+# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set
+# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set
+# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set
+# CONFIG_MQTT_CUSTOM_OUTBOX is not set
+# end of ESP-MQTT Configurations
+
+#
+# Newlib
+#
+CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y
+# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set
+# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set
+# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set
+# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set
+CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y
+# CONFIG_NEWLIB_NANO_FORMAT is not set
+CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y
+# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set
+# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set
+# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set
+# end of Newlib
+
+#
+# NVS
+#
+# CONFIG_NVS_ASSERT_ERROR_CHECK is not set
+# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set
+# end of NVS
+
+#
+# OpenThread
+#
+# CONFIG_OPENTHREAD_ENABLED is not set
+
+#
+# OpenThread Spinel
+#
+# CONFIG_OPENTHREAD_SPINEL_ONLY is not set
+# end of OpenThread Spinel
+# end of OpenThread
+
+#
+# Protocomm
+#
+CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y
+CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y
+CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y
+# end of Protocomm
+
+#
+# PThreads
+#
+CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5
+CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
+CONFIG_PTHREAD_STACK_MIN=768
+CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y
+# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set
+# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set
+CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1
+CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread"
+# end of PThreads
+
+#
+# MMU Config
+#
+CONFIG_MMU_PAGE_SIZE_64KB=y
+CONFIG_MMU_PAGE_MODE="64KB"
+CONFIG_MMU_PAGE_SIZE=0x10000
+# end of MMU Config
+
+#
+# Main Flash configuration
+#
+
+#
+# SPI Flash behavior when brownout
+#
+CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y
+CONFIG_SPI_FLASH_BROWNOUT_RESET=y
+# end of SPI Flash behavior when brownout
+
+#
+# Optional and Experimental Features (READ DOCS FIRST)
+#
+
+#
+# Features here require specific hardware (READ DOCS FIRST!)
+#
+CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50
+# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set
+# end of Optional and Experimental Features (READ DOCS FIRST)
+# end of Main Flash configuration
+
+#
+# SPI Flash driver
+#
+# CONFIG_SPI_FLASH_VERIFY_WRITE is not set
+# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set
+CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
+CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
+# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
+# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
+# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
+# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
+CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
+CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20
+CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1
+CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192
+# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set
+# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set
+# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set
+
+#
+# Auto-detect flash chips
+#
+CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y
+CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y
+CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y
+CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y
+CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y
+CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y
+CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y
+CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y
+CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y
+# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set
+# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set
+# end of Auto-detect flash chips
+
+CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y
+# end of SPI Flash driver
+
+#
+# SPIFFS Configuration
+#
+CONFIG_SPIFFS_MAX_PARTITIONS=3
+
+#
+# SPIFFS Cache Configuration
+#
+CONFIG_SPIFFS_CACHE=y
+CONFIG_SPIFFS_CACHE_WR=y
+# CONFIG_SPIFFS_CACHE_STATS is not set
+# end of SPIFFS Cache Configuration
+
+CONFIG_SPIFFS_PAGE_CHECK=y
+CONFIG_SPIFFS_GC_MAX_RUNS=10
+# CONFIG_SPIFFS_GC_STATS is not set
+CONFIG_SPIFFS_PAGE_SIZE=256
+CONFIG_SPIFFS_OBJ_NAME_LEN=32
+# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set
+CONFIG_SPIFFS_USE_MAGIC=y
+CONFIG_SPIFFS_USE_MAGIC_LENGTH=y
+CONFIG_SPIFFS_META_LENGTH=4
+CONFIG_SPIFFS_USE_MTIME=y
+
+#
+# Debug Configuration
+#
+# CONFIG_SPIFFS_DBG is not set
+# CONFIG_SPIFFS_API_DBG is not set
+# CONFIG_SPIFFS_GC_DBG is not set
+# CONFIG_SPIFFS_CACHE_DBG is not set
+# CONFIG_SPIFFS_CHECK_DBG is not set
+# CONFIG_SPIFFS_TEST_VISUALISATION is not set
+# end of Debug Configuration
+# end of SPIFFS Configuration
+
+#
+# TCP Transport
+#
+
+#
+# Websocket
+#
+CONFIG_WS_TRANSPORT=y
+CONFIG_WS_BUFFER_SIZE=1024
+# CONFIG_WS_DYNAMIC_BUFFER is not set
+# end of Websocket
+# end of TCP Transport
+
+#
+# Ultra Low Power (ULP) Co-processor
+#
+# CONFIG_ULP_COPROC_ENABLED is not set
+
+#
+# ULP Debugging Options
+#
+# end of ULP Debugging Options
+# end of Ultra Low Power (ULP) Co-processor
+
+#
+# Unity unit testing library
+#
+CONFIG_UNITY_ENABLE_FLOAT=y
+CONFIG_UNITY_ENABLE_DOUBLE=y
+# CONFIG_UNITY_ENABLE_64BIT is not set
+# CONFIG_UNITY_ENABLE_COLOR is not set
+CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y
+# CONFIG_UNITY_ENABLE_FIXTURE is not set
+# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set
+# end of Unity unit testing library
+
+#
+# Virtual file system
+#
+CONFIG_VFS_SUPPORT_IO=y
+CONFIG_VFS_SUPPORT_DIR=y
+CONFIG_VFS_SUPPORT_SELECT=y
+CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y
+# CONFIG_VFS_SELECT_IN_RAM is not set
+CONFIG_VFS_SUPPORT_TERMIOS=y
+CONFIG_VFS_MAX_COUNT=8
+
+#
+# Host File System I/O (Semihosting)
+#
+CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1
+# end of Host File System I/O (Semihosting)
+
+CONFIG_VFS_INITIALIZE_DEV_NULL=y
+# end of Virtual file system
+
+#
+# Wear Levelling
+#
+# CONFIG_WL_SECTOR_SIZE_512 is not set
+CONFIG_WL_SECTOR_SIZE_4096=y
+CONFIG_WL_SECTOR_SIZE=4096
+# end of Wear Levelling
+
+#
+# Wi-Fi Provisioning Manager
+#
+CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16
+CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30
+CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y
+# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set
+# end of Wi-Fi Provisioning Manager
+
+#
+# wolfSSL
+#
+
+#
+# Hardening
+#
+# CONFIG_ESP_WOLFSSL_WC_NO_HARDEN is not set
+# CONFIG_ESP_WOLFSSL_TFM_TIMING_RESISTANT is not set
+# end of Hardening
+
+# CONFIG_ESP_WOLFSSL_ENABLE_BENCHMARK is not set
+
+#
+# Benchmark Debug
+#
+# end of Benchmark Debug
+
+# CONFIG_ESP_WOLFSSL_ENABLE_TEST is not set
+
+#
+# wolfCrypt tests
+#
+# end of wolfCrypt tests
+
+#
+# Apple HomeKit
+#
+# CONFIG_WOLFSSL_APPLE_HOMEKIT is not set
+# end of Apple HomeKit
+
+# CONFIG_ESP_WOLFSSL_DISABLE_MY_ECC is not set
+# CONFIG_ESP_WOLFSSL_ENABLE_MY_USE_RSA is not set
+# CONFIG_ESP_WOLFSSL_BENCHMARK is not set
+# CONFIG_ESP_TLS_USING_WOLFSSL_SPECIFIED is not set
+# CONFIG_ESP_WOLFSSL_NO_USE_FAST_MATH is not set
+
+#
+# Protocol Config
+#
+CONFIG_WOLFSSL_HAVE_ALPN=y
+CONFIG_WOLFSSL_ALLOW_TLS13=y
+# CONFIG_WOLFSSL_ALLOW_TLS12 is not set
+CONFIG_WOLFSSL_HAVE_TLS_EXTENSIONS=y
+# CONFIG_WOLFSSL_ALT_CERT_CHAINS is not set
+# CONFIG_WOLFSSL_HAVE_OCSP is not set
+# end of Protocol Config
+
+# CONFIG_ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION is not set
+
+#
+# wolfSSL Hardware Acceleration
+#
+# CONFIG_ESP_WOLFSSL_DEBUG_ESP_HW_MULTI_RSAMAX_BITS is not set
+# CONFIG_ESP_WOLFSSL_DEBUG_ESP_HW_MOD_RSAMAX_BITS is not set
+# end of wolfSSL Hardware Acceleration
+
+#
+# wolfSSL Post Quantum Kyber KEM PQ
+#
+# CONFIG_ESP_WOLFSSL_ENABLE_MLKEM is not set
+# CONFIG_WOLFSSL_ENABLE_KYBER is not set
+# end of wolfSSL Post Quantum Kyber KEM PQ
+
+#
+# wolfSSL Debug Options
+#
+# CONFIG_ESP_WOLFSSL_DEBUG_WOLFSSL is not set
+# CONFIG_ESP_WOLFSSL_NO_STACK_SIZE_BUILD_WARNING is not set
+CONFIG_ESP_WOLFSSL_TEST_LOOP=y
+# CONFIG_ESP_WOLFSSL_EXPERIMENTAL_SETTINGS is not set
+# end of wolfSSL Debug Options
+
+#
+# wolfSSL Customization
+#
+CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT="~/workspace/wolfssl"
+# end of wolfSSL Customization
+
+#
+# Component Config
+#
+# CONFIG_IGNORE_ESP_IDF_WOLFSSL_COMPONENT is not set
+# CONFIG_IGNORE_LOCAL_WOLFSSL_COMPONENT is not set
+# end of Component Config
+
+#
+# Utility Config
+#
+# CONFIG_USE_WOLFSSL_ESP_SDK_TIME is not set
+# CONFIG_USE_WOLFSSL_ESP_SDK_WIFI is not set
+# end of Utility Config
+# end of wolfSSL
+
+#
+# wolfSSH
+#
+# CONFIG_ESP_ENABLE_WOLFSSH is not set
+# CONFIG_ESP_WOLFSSL_DEBUG_WOLFSSH is not set
+# end of wolfSSH
+
+#
+# wolfMQTT
+#
+# CONFIG_ESP_ENABLE_WOLFMQTT is not set
+# CONFIG_ESP_WOLFSSL_DEBUG_WOLFMQTT is not set
+# end of wolfMQTT
+# end of Component config
+
+# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set
+
+# Deprecated options for backward compatibility
+# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set
+# CONFIG_NO_BLOBS is not set
+# CONFIG_ESP32_NO_BLOBS is not set
+# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set
+# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set
+CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y
+# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set
+CONFIG_LOG_BOOTLOADER_LEVEL=3
+# CONFIG_APP_ROLLBACK_ENABLE is not set
+# CONFIG_FLASH_ENCRYPTION_ENABLED is not set
+# CONFIG_FLASHMODE_QIO is not set
+# CONFIG_FLASHMODE_QOUT is not set
+CONFIG_FLASHMODE_DIO=y
+# CONFIG_FLASHMODE_DOUT is not set
+CONFIG_MONITOR_BAUD=115200
+CONFIG_OPTIMIZATION_LEVEL_DEBUG=y
+CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y
+CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y
+# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set
+# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set
+CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y
+# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set
+# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set
+CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2
+# CONFIG_CXX_EXCEPTIONS is not set
+# CONFIG_STACK_CHECK_NONE is not set
+CONFIG_STACK_CHECK_NORM=y
+# CONFIG_STACK_CHECK_STRONG is not set
+# CONFIG_STACK_CHECK_ALL is not set
+CONFIG_STACK_CHECK=y
+# CONFIG_WARN_WRITE_STRINGS is not set
+# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set
+CONFIG_ESP32_APPTRACE_DEST_NONE=y
+CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y
+CONFIG_ADC2_DISABLE_DAC=y
+# CONFIG_MCPWM_ISR_IN_IRAM is not set
+# CONFIG_EVENT_LOOP_PROFILING is not set
+CONFIG_POST_EVENTS_FROM_ISR=y
+CONFIG_POST_EVENTS_FROM_IRAM_ISR=y
+CONFIG_GDBSTUB_SUPPORT_TASKS=y
+CONFIG_GDBSTUB_MAX_TASKS=32
+# CONFIG_OTA_ALLOW_HTTP is not set
+# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set
+CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y
+CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4
+# CONFIG_ESP_SYSTEM_PD_FLASH is not set
+CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000
+CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000
+CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y
+CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y
+# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set
+# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set
+# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set
+# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set
+# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set
+# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set
+CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024
+# CONFIG_ESP32_XTAL_FREQ_26 is not set
+CONFIG_ESP32_XTAL_FREQ_40=y
+# CONFIG_ESP32_XTAL_FREQ_AUTO is not set
+CONFIG_ESP32_XTAL_FREQ=40
+CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y
+# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set
+CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20
+CONFIG_ESP32_PHY_MAX_TX_POWER=20
+# CONFIG_REDUCE_PHY_TX_POWER is not set
+# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set
+# CONFIG_SPIRAM_SUPPORT is not set
+# CONFIG_ESP32_SPIRAM_SUPPORT is not set
+# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set
+# CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set
+CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y
+CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240
+CONFIG_TRACEMEM_RESERVE_DRAM=0x0
+# CONFIG_ESP32_PANIC_PRINT_HALT is not set
+CONFIG_ESP32_PANIC_PRINT_REBOOT=y
+# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set
+# CONFIG_ESP32_PANIC_GDBSTUB is not set
+CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32
+CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304
+CONFIG_MAIN_TASK_STACK_SIZE=55500
+CONFIG_CONSOLE_UART_DEFAULT=y
+# CONFIG_CONSOLE_UART_CUSTOM is not set
+# CONFIG_CONSOLE_UART_NONE is not set
+# CONFIG_ESP_CONSOLE_UART_NONE is not set
+CONFIG_CONSOLE_UART=y
+CONFIG_CONSOLE_UART_NUM=0
+CONFIG_CONSOLE_UART_BAUDRATE=115200
+CONFIG_INT_WDT=y
+CONFIG_INT_WDT_TIMEOUT_MS=300
+CONFIG_INT_WDT_CHECK_CPU1=y
+CONFIG_TASK_WDT=y
+CONFIG_ESP_TASK_WDT=y
+# CONFIG_TASK_WDT_PANIC is not set
+CONFIG_TASK_WDT_TIMEOUT_S=5
+CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
+CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
+# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set
+CONFIG_ESP32_DEBUG_OCDAWARE=y
+CONFIG_BROWNOUT_DET=y
+CONFIG_ESP32_BROWNOUT_DET=y
+CONFIG_BROWNOUT_DET_LVL_SEL_0=y
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y
+# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set
+CONFIG_BROWNOUT_DET_LVL=0
+CONFIG_ESP32_BROWNOUT_DET_LVL=0
+# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set
+CONFIG_IPC_TASK_STACK_SIZE=1024
+CONFIG_TIMER_TASK_STACK_SIZE=3584
+CONFIG_ESP32_WIFI_ENABLED=y
+CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10
+CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32
+# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set
+CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y
+CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1
+CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32
+# CONFIG_ESP32_WIFI_CSI_ENABLED is not set
+CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
+CONFIG_ESP32_WIFI_TX_BA_WIN=6
+CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
+CONFIG_ESP32_WIFI_RX_BA_WIN=6
+CONFIG_ESP32_WIFI_NVS_ENABLED=y
+CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y
+# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set
+CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752
+CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32
+CONFIG_ESP32_WIFI_IRAM_OPT=y
+CONFIG_ESP32_WIFI_RX_IRAM_OPT=y
+CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y
+CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y
+CONFIG_WPA_MBEDTLS_CRYPTO=y
+CONFIG_WPA_MBEDTLS_TLS_CLIENT=y
+# CONFIG_WPA_WAPI_PSK is not set
+# CONFIG_WPA_11KV_SUPPORT is not set
+# CONFIG_WPA_MBO_SUPPORT is not set
+# CONFIG_WPA_DPP_SUPPORT is not set
+# CONFIG_WPA_11R_SUPPORT is not set
+# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set
+# CONFIG_WPA_WPS_STRICT is not set
+# CONFIG_WPA_DEBUG_PRINT is not set
+# CONFIG_WPA_TESTING_OPTIONS is not set
+# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set
+# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set
+CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y
+CONFIG_TIMER_TASK_PRIORITY=1
+CONFIG_TIMER_TASK_STACK_DEPTH=2048
+CONFIG_TIMER_QUEUE_LENGTH=10
+# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set
+# CONFIG_HAL_ASSERTION_SILIENT is not set
+# CONFIG_L2_TO_L3_COPY is not set
+CONFIG_ESP_GRATUITOUS_ARP=y
+CONFIG_GARP_TMR_INTERVAL=60
+CONFIG_TCPIP_RECVMBOX_SIZE=32
+CONFIG_TCP_MAXRTX=12
+CONFIG_TCP_SYNMAXRTX=12
+CONFIG_TCP_MSS=1440
+CONFIG_TCP_MSL=60000
+CONFIG_TCP_SND_BUF_DEFAULT=5744
+CONFIG_TCP_WND_DEFAULT=5744
+CONFIG_TCP_RECVMBOX_SIZE=6
+CONFIG_TCP_QUEUE_OOSEQ=y
+CONFIG_TCP_OVERSIZE_MSS=y
+# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set
+# CONFIG_TCP_OVERSIZE_DISABLE is not set
+CONFIG_UDP_RECVMBOX_SIZE=6
+CONFIG_TCPIP_TASK_STACK_SIZE=3072
+CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
+# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set
+# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set
+CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF
+# CONFIG_PPP_SUPPORT is not set
+CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y
+CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y
+# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set
+# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set
+# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set
+# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set
+CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5
+CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
+CONFIG_ESP32_PTHREAD_STACK_MIN=768
+CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y
+# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set
+# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set
+CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1
+CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread"
+CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y
+# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set
+# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set
+# CONFIG_ESP32_ULP_COPROC_ENABLED is not set
+CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y
+CONFIG_SUPPORT_TERMIOS=y
+CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1
+# End of deprecated options
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/CMakeLists.txt b/ide/Espressif/ESP-IDF/examples/wolfssh_template/CMakeLists.txt
index 58fa04c8..ae4f1389 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_template/CMakeLists.txt
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/CMakeLists.txt
@@ -1,3 +1,26 @@
+# [wolfSSL Project]/CMakeLists.txt
+#
+# Copyright (C) 2014-2025 wolfSSL Inc.
+#
+# This file is part of wolfSSH.
+#
+# wolfSSH is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# wolfSSH is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with wolfSSH. If not, see .
+#
+# cmake for WOLFSSH Espressif projects
+#
+# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html
+
# wolfSSL Espressif Example Project CMakeLists.txt
# v1.0
#
@@ -9,9 +32,15 @@ cmake_minimum_required(VERSION 3.16)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS")
set(WOLFSSL_USER_SETTINGS ON)
+# Assume we have a ESP_ENABLE_WOLFSSH section in user_settings.h
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DESP_ENABLE_WOLFSSH")
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSH_TERM")
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDEBUG_WOLFSSH")
+# Managed wolfSSL Components prior to 5.7.4 need a manual setting for WOLFSSL_WOLFSSH
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_WOLFSSH")
+
+# Optional:
+# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSH_TERM")
+# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDEBUG_WOLFSSH")
# The wolfSSL CMake file should be able to find the source code.
# Otherwise, assign an environment variable or set it here:
@@ -32,28 +61,28 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDEBUG_WOLFSSH")
if(WIN32)
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS")
- message("Detected Windows")
+ message(STATUS "Detected Windows")
endif()
if(CMAKE_HOST_UNIX)
- message("Detected UNIX")
+ message(STATUS "Detected UNIX")
endif()
if(APPLE)
- message("Detected APPLE")
+ message(STATUS "Detected APPLE")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop")
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL")
- message("Detected WSL")
+ message(STATUS "Detected WSL")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32))
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX")
- message("Detected Linux")
+ message(STATUS "Detected Linux")
endif()
if(APPLE)
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE")
- message("Detected Apple")
+ message(STATUS "Detected Apple")
endif()
# End optional WOLFSSL_CMAKE_SYSTEM_NAME
@@ -78,6 +107,18 @@ else()
message(STATUS "No conflicting wolfSSL components found.")
endif()
+
+# This example uses an extra component for common functions such as Wi-Fi and Ethernet connection.
+set (PROTOCOL_EXAMPLES_DIR $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)
+
+if (EXISTS "${PROTOCOL_EXAMPLES_DIR}")
+ message(STATUS "Found PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}")
+ set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFOUND_PROTOCOL_EXAMPLES_DIR")
+else()
+ message("NOT FOUND: PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}")
+endif()
+
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(wolfssh_template)
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssh/CMakeLists.txt b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssh/CMakeLists.txt
index b32d5cb8..4279c3a4 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssh/CMakeLists.txt
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssh/CMakeLists.txt
@@ -1,6 +1,6 @@
-# Espressif component/wolfssh/CMakeLists.txt
+# [wolfSSL Project]/components/wolfssh/CMakeLists.txt
#
-# Copyright (C) 2014-2024 wolfSSL Inc.
+# Copyright (C) 2014-2025 wolfSSL Inc.
#
# This file is part of wolfSSH.
#
@@ -17,27 +17,105 @@
# You should have received a copy of the GNU General Public License
# along with wolfSSH. If not, see .
#
-# cmake for WOLFSSH Espressif projects
+# cmake for wolfssh Espressif projects v5.7.6 (template pr)
#
# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html
#
cmake_minimum_required(VERSION 3.16)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSH_USER_SETTINGS")
+
+set(VERBOSE_COMPONENT_MESSAGES 1)
+
+# The scope of this CMAKE_C_FLAGS is just this component:
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS")
+
set(CMAKE_CURRENT_SOURCE_DIR ".")
+message(STATUS "CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")
+
+get_filename_component(THIS_DIR "${CMAKE_CURRENT_LIST_DIR}" ABSOLUTE)
+message(STATUS "THIS_DIR = ${THIS_DIR}")
+
+# The root of the project is two directories up from here. (we are typically in [project name]components/mywolfssh)
+get_filename_component(PROJECT_ROOT "${THIS_DIR}" DIRECTORY) # Up one directory from here is "components"
+get_filename_component(PROJECT_ROOT "${PROJECT_ROOT}" DIRECTORY) # up one more directory should be the root of our project
+message(STATUS "PROJECT_ROOT = ${PROJECT_ROOT}")
+
+# in case wolfssl user_settings.h is missing, we'll look for one in the ESP32/lib directory:
+get_filename_component(LIB_USER_SETTINGS "${PROJECT_ROOT}/../lib/user_settings.h" ABSOLUTE)
+message(STATUS "wolfssl user_settings.h lib = ${LIB_USER_SETTINGS}")
+
+get_filename_component(THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH "${PROJECT_ROOT}/components/wolfssl/include" ABSOLUTE)
+message(STATUS "wolfssl user_settings.h path = ${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}")
+
+# Optionally set your source to wolfSSL in your project CMakeLists.txt like this:
+# set(WOLFSSH_ROOT "c:/some/workspace/wolfssh" )
+
+if ( "${WOLFSSH_ROOT}" STREQUAL "")
+ set(WOLFSSH_ROOT "$ENV{WOLFSSH_ROOT}" )
+endif()
+
+# Optional compiler definitions to help with system name detection (typically printed by app diagnostics)
+if( VERBOSE_COMPONENT_MESSAGES )
+ if(WIN32)
+ # Windows-specific configuration here
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS")
+ message(STATUS "Detected Windows")
+ endif()
+ if(CMAKE_HOST_UNIX)
+ message(STATUS "Detected UNIX")
+ endif()
+ if(APPLE)
+ message(STATUS "Detected APPLE")
+ endif()
+ if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop")
+ # Windows-specific configuration here
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL")
+ message(STATUS "Detected WSL")
+ endif()
+ if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32))
+ # Windows-specific configuration here
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX")
+ message(STATUS "Detected Linux")
+ endif()
+ if(APPLE)
+ # Windows-specific configuration here
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE")
+ message(STATUS "Detected Apple")
+ endif()
+endif() # End optional WOLFSSL_CMAKE_SYSTEM_NAME
+
+message(STATUS "CONFIG_TARGET_PLATFORM = ${CONFIG_TARGET_PLATFORM}")
+
+# find the user name to search for possible "wolfssh-username"
+# find the user name to search for possible "wolfssh-username"
+message(STATUS "USERNAME = $ENV{USERNAME}")
+if( "$ENV{USER}" STREQUAL "" ) # the bash user
+ if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user
+ message(STATUS "could not find USER or USERNAME")
+ else()
+ # the bash user is not blank, so we'll use it.
+ set(THIS_USER "$ENV{USERNAME}")
+ endif()
+else()
+ # the bash user is not blank, so we'll use it.
+ set(THIS_USER "$ENV{USER}")
+endif()
+message(STATUS "THIS_USER = ${THIS_USER}")
+
# Attention!
#
# When editing component CMake files, consider the following :
#
-# NO Managed Componenets: Normal stand-alone app, "as cloned" from github.
-# There's no notion of staging names (e.g. mywolfmqtt) regardless of environment settings.
+# NO Managed Components: Normal stand-alone app, "as cloned" from github.
+# There's no notion of staging names (e.g. mywolfssh) regardless of environment settings.
# All of the component source is locall. See settings such s WOLFSSL_ROOT=[your path]
#
# Partially Managed Components. This one is tricky. When publishing a component with examples,
# those examples will have a chicken-and-egg problem: the required component is not yet published.
# Adding to the complexity is the notion of staging components, that are purposely prefixed with
-# "my" (e.g. mywolfmqtt) to distinguish from production, live components (e.g. wolfmqtt)
+# "my" (e.g. mywolfssh) to distinguish from production, live components (e.g. wolfssh)
#
# Partially Managed Component Examples are typically only encountered by the component publisher
# and only at publish time, such as when performing the pre-publish build check.
@@ -45,49 +123,185 @@ set(CMAKE_CURRENT_SOURCE_DIR ".")
# A partially managed component may also be manually created, when adding a managed component to
# and existing project. For example:
#
-# idf.py add-dependency "wolfssl/wolfssh^1.4.15-stable"
+# idf.py add-dependency "wolfssl/wolfssh^1.4.18"
#
-# Fully Managaged Componenets. This is the typical example as created from the Component Registry:
+# Fully Managed Components. This is the typical example as created from the Component Registry:
# For example:
#
-# idf.py create-project-from-example "wolfssl/wolfssh^1.4.15-stable:wolfssh_server"
+# idf.py create-project-from-example "wolfssl/wolfssh^1.4.18"
#
# In all cases, keep in mind that components other than wolfssl will depend on the wolfssl component.
#
+message(STATUS "CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")
+
+get_filename_component(THIS_DIR "${CMAKE_CURRENT_LIST_DIR}" ABSOLUTE)
+message(STATUS "THIS_DIR = ${THIS_DIR}")
+
+# The root of the project is two directories up from here. (we are typically in [project name]components/mywolfssh)
+get_filename_component(PROJECT_ROOT "${THIS_DIR}" DIRECTORY) # Up one directory from here is "components"
+get_filename_component(PROJECT_ROOT "${PROJECT_ROOT}" DIRECTORY) # up one more directory should be the root of our project
+message(STATUS "PROJECT_ROOT = ${PROJECT_ROOT}")
+
# Component naming is only adjusted when using Managed Components, and only when using staging site.
if( "$ENV{IDF_COMPONENT_REGISTRY_URL}" STREQUAL "https://components-staging.espressif.com" )
# TODO: Is checking these two variables really the best way to detect an active Component Manager?
message(STATUS "component_manager_interface_version = ${component_manager_interface_version}")
message(STATUS "managed_components = ${managed_components}")
- if( ("${managed_components}" STREQUAL "") AND ("${component_manager_interface_version}" STREQUAL "") )
+ message(STATUS "Checking if wolfssl is in ${PROJECT_ROOT}/managed_components/${THIS_USER}__mywolfssl")
+
+ if(EXISTS "${PROJECT_ROOT}/managed_components/${THIS_USER}__mywolfssl/CMakeLists.txt")
+ message(STATUS "Found user-specific, managed, staging component. The wolfssl component will be named mywolfssl.")
+ set(WOLFSSL_COMPONENT_NAME "mywolfssl")
+ elseif( ("${managed_components}" STREQUAL "") AND ("${component_manager_interface_version}" STREQUAL "") )
# We've found a staging component, but did not detect the component manager
+ message(STATUS "No component manager interface component wolfssl ${CMAKE_HOME_DIRECTORY}")
set(WOLFSSL_COMPONENT_NAME "wolfssl")
else()
+ message(STATUS "else mywolfssl")
set(WOLFSSL_COMPONENT_NAME "mywolfssl")
endif()
+elseif(EXISTS "${CMAKE_HOME_DIRECTORY}/managed_components/${THIS_USER}__mywolfssl/CMakeLists.txt")
+ message(STATUS "Found managed_components mywolfssl")
+ set(WOLFSSL_COMPONENT_NAME "mywolfssl")
else()
+ message(STATUS "Not staging environment, no managed_components wolfssl")
set(WOLFSSL_COMPONENT_NAME "wolfssl")
endif()
set(COMPONENT_REQUIRES lwip "${WOLFSSL_COMPONENT_NAME}")
+# function: IS_WOLFSSH_SOURCE
+# parameter: DIRECTORY_PARAMETER = the directory to test
+# output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssh directory, otherwise blank.
+function(IS_WOLFSSH_SOURCE DIRECTORY_PARAMETER RESULT)
+ if (EXISTS "${DIRECTORY_PARAMETER}/wolfssh/ssh.h")
+ if (EXISTS "${DIRECTORY_PARAMETER}/wolfssh")
+ message(STATUS "1")
+ endif()
+ if (EXISTS "${DIRECTORY_PARAMETER}")
+ message(STATUS "2")
+ endif()
+ if (EXISTS "${DIRECTORY_PARAMETER}/src")
+ message(STATUS "3")
+ endif()
+ set(${RESULT} "${DIRECTORY_PARAMETER}" PARENT_SCOPE)
+ else()
+ set(${RESULT} "" PARENT_SCOPE)
+ endif()
+endfunction()
+
+# function: FIND_WOLFSSH_DIRECTORY
+# parameter: OUTPUT_FOUND_WOLFSSH_DIRECTORY contains root of source code, otherwise blank
+#
+function(FIND_WOLFSSH_DIRECTORY OUTPUT_FOUND_WOLFSSH_DIRECTORY)
+ message(STATUS "Starting FIND_WOLFSSH_DIRECTORY")
+
+ message(STATUS "OUTPUT_FOUND_WOLFSSH_DIRECTORY = ${${OUTPUT_FOUND_WOLFSSH_DIRECTORY}}")
+ IS_WOLFSSH_SOURCE("${${OUTPUT_FOUND_WOLFSSH_DIRECTORY}}" FOUND_WOLFSSH)
+ if( FOUND_WOLFSSH )
+ set(${OUTPUT_FOUND_WOLFSSH_DIRECTORY} ${${OUTPUT_FOUND_WOLFSSH_DIRECTORY}} PARENT_SCOPE)
+ return()
+ endif()
+ message(STATUS "")
+
+ if ( "${${OUTPUT_FOUND_WOLFSSH_DIRECTORY}}" STREQUAL "" )
+ set(CURRENT_SEARCH_DIR "$ENV{WOLFSSH_ROOT}")
+ if( "${CURRENT_SEARCH_DIR}" STREQUAL "" )
+ message(STATUS "The WOLFSSH_ROOT environment variable is not set. Searching...")
+ else()
+ get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSH_ROOT}" ABSOLUTE)
+ IS_WOLFSSH_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSH)
+ if( FOUND_WOLFSSH )
+ message(STATUS "Found WOLFSSH_ROOT via Environment Variable:")
+ else()
+ message(FATAL_ERROR "WOLFSSH_ROOT Environment Variable defined, but path not found:")
+ message(STATUS "$ENV{WOLFSSH_ROOT}")
+ endif()
+ endif()
+ else()
+ # There's a non-blank WOLFSSH_ROOT environment variable. Is it a valid wolfssh directory?
+ get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSH_ROOT}" ABSOLUTE)
+ IS_WOLFSSH_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSH)
+ if("${FOUND_WOLFSSH}")
+ message(STATUS "Found WOLFSSH_ROOT via Environment Variable:")
+ else()
+ message(FATAL_ERROR "WOLFSSH_ROOT Environment Variable defined, but path not found: $ENV{WOLFSSH_ROOT}")
+ #message(STATUS "Exit CMake")
+ endif()
+ endif()
+
+ # we'll start in the THIS_CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssh
+ message(STATUS "THIS_CMAKE_CURRENT_SOURCE_DIR = ${THIS_CMAKE_CURRENT_SOURCE_DIR}")
+ get_filename_component(CURRENT_SEARCH_DIR "${THIS_CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
+ message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
+ string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH)
+
+ # loop through all the parents, looking for wolfssh
+ while(NOT CURRENT_SEARCH_DIR STREQUAL "/" AND NOT CURRENT_SEARCH_DIR STREQUAL "" )
+ string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH)
+ # wolfssh may simply be in a parent directory, such as for local examples in wolfssh repo
+ IS_WOLFSSH_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSH)
+ if( FOUND_WOLFSSH )
+ message(STATUS "Found wolfssh in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
+ set(${OUTPUT_FOUND_WOLFSSH_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
+ return()
+ endif()
+
+ if( THIS_USER )
+ # Check for "wolfssh-[username]" subdirectory as we recurse up the directory tree
+ set(CURRENT_SEARCH_DIR_ALT "${CURRENT_SEARCH_DIR}/wolfssh-${THIS_USER}")
+ message(STATUS "Looking in ${CURRENT_SEARCH_DIR}")
+
+ #if(EXISTS ${CURRENT_SEARCH_DIR_ALT} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR_ALT} AND EXISTS "${CURRENT_SEARCH_DIR_ALT}/wolfcrypt/src")
+ IS_WOLFSSH_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSH )
+ if ( FOUND_WOLFSSH )
+ message(STATUS "Found wolfssh in user-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}")
+ set(${OUTPUT_FOUND_WOLFSSH_DIRECTORY} ${CURRENT_SEARCH_DIR_ALT} PARENT_SCOPE)
+ return()
+ endif()
+ endif()
+
+ # Next check for no user suffix "wolfssh" subdirectory as we recurse up the directory tree
+ set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssh)
+ # if(EXISTS ${CURRENT_SEARCH_DIR} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR} AND EXISTS "${CURRENT_SEARCH_DIR}/wolfcrypt/src")
+ IS_WOLFSSH_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSH )
+ if ( FOUND_WOLFSSH )
+ message(STATUS "Found wolfssh in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
+ set(${OUTPUT_FOUND_WOLFSSH_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
+ return()
+ endif()
+
+ # Move up one directory level
+ set(PRIOR_SEARCH_DIR "${CURRENT_SEARCH_DIR}")
+ get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" DIRECTORY)
+ message(STATUS "Next CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
+ if( "${PRIOR_SEARCH_DIR}" STREQUAL "${CURRENT_SEARCH_DIR}" )
+ # when the search directory is empty, we'll give up
+ set(CURRENT_SEARCH_DIR "")
+ endif()
+ endwhile()
+
+ # If not found, set the output variable to empty before exiting
+ set(${OUTPUT_FOUND_WOLFSSH_DIRECTORY} "" PARENT_SCOPE)
+endfunction()
+
# COMPONENT_NAME = wolfssh
# The component name is the directory name. "No feature to change this".
# See https://github.com/espressif/esp-idf/issues/8978#issuecomment-1129892685
-# set the root of WOLFSSH in top-level project CMakelists.txt:
+# set the root of wolfssh in top-level project CMakelists.txt:
# set(WOLFSSH_ROOT "C:/some path/with/spaces")
-# set(WOLFSSH_ROOT "c:/workspace/WOLFSSH-[username]")
+# set(WOLFSSH_ROOT "c:/workspace/wolfssh-[username]")
# set(WOLFSSH_ROOT "/mnt/c/some path/with/spaces")
# or use this logic to assign value from Environment Variable WOLFSSH_ROOT,
# or assume this is an example 7 subdirectories below:
-# We are typically in [root]/IDE/Espressif/ESP-IDF/examples/WOLFSSH_test/components/WOLFSSH
-# The root of WOLFSSH is 7 directories up from here:
+# We are typically in [root]/IDE/Espressif/ESP-IDF/examples/wolfssh_test/components/wolfssh
+# The root of wolfssh is 7 directories up from here:
if(CMAKE_BUILD_EARLY_EXPANSION)
- message(STATUS "WOLFSSH component CMAKE_BUILD_EARLY_EXPANSION:")
+ message(STATUS "wolfssh component CMAKE_BUILD_EARLY_EXPANSION:")
idf_component_register(
REQUIRES "${COMPONENT_REQUIRES}"
PRIV_REQUIRES
@@ -101,25 +315,26 @@ else()
message(STATUS "************************************************************************************************")
message(STATUS "wolfssh component config:")
message(STATUS "************************************************************************************************")
+ FIND_WOLFSSH_DIRECTORY(WOLFSSH_ROOT)
- # Check to see if we're already in WOLFSSH, and only if WOLFSSH_ROOT not specified
+ # Check to see if we're already in wolfssh, and only if WOLFSSH_ROOT not specified
if ("${WOLFSSH_ROOT}" STREQUAL "")
- # WOLFSSH examples are 7 directories deep from WOLFSSH repo root
+ # wolfssh examples are 7 directories deep from wolfssh repo root
# 1 2 3 4 5 6 7
set(THIS_RELATIVE_PATH "../../../../../../..")
get_filename_component(THIS_SEARCH_PATH "${THIS_RELATIVE_PATH}" ABSOLUTE)
message(STATUS "Searching in path = ${THIS_SEARCH_PATH}")
if (EXISTS "${THIS_SEARCH_PATH}/wolfcrypt/src")
- # we're already in WOLFSSH examples!
+ # we're already in wolfssh examples!
get_filename_component(WOLFSSH_ROOT "${THIS_SEARCH_PATH}" ABSOLUTE)
- message(STATUS "Using WOLFSSH example with root ${WOLFSSH_ROOT}")
+ message(STATUS "Using wolfssh example with root ${WOLFSSH_ROOT}")
else()
# We're in some other repo such as wolfssh, so we'll search for an
- # adjacent-level directory for WOLFSSH. (8 directories up, then down one)
+ # adjacent-level directory for wolfssh. (8 directories up, then down one)
#
- # For example WOLFSSH examples:
- # C:\workspace\WOLFSSH-gojimmypi\IDE\Espressif\ESP-IDF\examples\WOLFSSH_benchmark\components\WOLFSSH
+ # For example wolfssh examples:
+ # C:\workspace\wolfssh-gojimmypi\IDE\Espressif\ESP-IDF\examples\wolfssh_benchmark\components\wolfssh
#
# For example wolfSSH examples:
# C:\workspace\wolfssh-gojimmypi\ide\Espressif\ESP-IDF\examples\wolfssh_benchmark\components\WOLFSSH
@@ -141,7 +356,7 @@ else()
get_filename_component(THIS_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
message(STATUS "THIS_DIR = ${THIS_DIR}")
- # find the user name to search for possible "WOLFSSH-username"
+ # find the user name to search for possible "wolfssh-username"
message(STATUS "USERNAME = $ENV{USERNAME}")
if( "$ENV{USER}" STREQUAL "" ) # the bash user
if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user
@@ -156,35 +371,35 @@ else()
endif()
message(STATUS "THIS_USER = ${THIS_USER}")
- # This same makefile is used for both the WOLFSSH component, and other
- # components that may depend on WOLFSSH, such as wolfssh. Therefore
- # we need to determine if this makefile is in the WOLFSSH repo, or
+ # This same makefile is used for both the wolfssh component, and other
+ # components that may depend on wolfssh, such as wolfssh. Therefore
+ # we need to determine if this makefile is in the wolfssh repo, or
# some other repo.
if( "{THIS_USER}" STREQUAL "" )
# This is highly unusual to not find a user name.
- # In this case, we'll just search for a "WOLFSSH" directory:
+ # In this case, we'll just search for a "wolfssh" directory:
message(STATUS "No username found!")
- get_filename_component(WOLFSSH_ROOT "${THIS_RELATIVE_PATH}/WOLFSSH" ABSOLUTE)
+ get_filename_component(WOLFSSH_ROOT "${THIS_RELATIVE_PATH}/wolfssh" ABSOLUTE)
else()
# We found an environment USER name!
- # The first place to look for WOLFSSH will be in a user-clone called "WOLFSSH-[username]"
- message(STATUS "Using [THIS_USER = ${THIS_USER}] to see if there's a [relative path]/WOLFSSH-${THIS_USER} directory.")
- get_filename_component(WOLFSSH_ROOT "${THIS_RELATIVE_PATH}/WOLFSSH-${THIS_USER}" ABSOLUTE)
+ # The first place to look for wolfssh will be in a user-clone called "wolfssh-[username]"
+ message(STATUS "Using [THIS_USER = ${THIS_USER}] to see if there's a [relative path]/wolfssh-${THIS_USER} directory.")
+ get_filename_component(WOLFSSH_ROOT "${THIS_RELATIVE_PATH}/wolfssh-${THIS_USER}" ABSOLUTE)
if( EXISTS "${WOLFSSH_ROOT}" )
- message(STATUS "Found WOLFSSH in user-suffix ${WOLFSSH_ROOT}")
+ message(STATUS "Found wolfssh in user-suffix ${WOLFSSH_ROOT}")
else()
- # If there's not a user-clone called "WOLFSSH-[username]",
- # perhaps there's simply a git clone called "WOLFSSH"?
- message(STATUS "Did not find WOLFSSH-${THIS_USER}; continuing search...")
- get_filename_component(WOLFSSH_ROOT "${THIS_RELATIVE_PATH}/WOLFSSH" ABSOLUTE)
+ # If there's not a user-clone called "wolfssh-[username]",
+ # perhaps there's simply a git clone called "wolfssh"?
+ message(STATUS "Did not find wolfssh-${THIS_USER}; continuing search...")
+ get_filename_component(WOLFSSH_ROOT "${THIS_RELATIVE_PATH}/wolfssh" ABSOLUTE)
if( EXISTS "${WOLFSSH_ROOT}" )
- message(STATUS "Found WOLFSSH in standard ${WOLFSSH_ROOT}")
+ message(STATUS "Found wolfssh in standard ${WOLFSSH_ROOT}")
else()
# Things are looking pretty bleak. We'll likely not be able to compile.
- message(STATUS "Did not find WOLFSSH in ${WOLFSSH_ROOT}")
+ message(STATUS "Did not find wolfssh in ${WOLFSSH_ROOT}")
endif()
endif()
endif()
@@ -211,8 +426,8 @@ else()
if( EXISTS "${WOLFSSH_ROOT}" )
message(STATUS "WOLFSSH_ROOT = ${WOLFSSH_ROOT}")
else()
- # Abort. We need WOLFSSH _somewhere_.
- message(FATAL_ERROR "Could not find WOLFSSH in ${WOLFSSH_ROOT}. Try setting environment variable or git clone.")
+ # Abort. We need wolfssh _somewhere_.
+ message(FATAL_ERROR "Could not find wolfssh in ${WOLFSSH_ROOT}. Try setting environment variable or git clone.")
endif()
@@ -233,86 +448,97 @@ else()
message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}")
#
- # Check to see if there's both a local copy and EDP-IDF copy of the WOLFSSH and/or wolfssh components.
+ # Check to see if there's both a local copy and EDP-IDF copy of the wolfssh and/or wolfssh components.
#
- if( EXISTS "${WOLFSSH_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/WOLFSSH/" )
+ if( EXISTS "${WOLFSSH_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssh/" )
#
- # WOLFSSH found in both ESP-IDF and local project - needs to be resolved by user
+ # wolfssh found in both ESP-IDF and local project - needs to be resolved by user
#
message(STATUS "")
message(STATUS "**************************************************************************************")
message(STATUS "")
- message(STATUS "Error: Found components/WOLFSSH in both local project and IDF_PATH")
+ message(STATUS "Error: Found components/wolfssh in both local project and IDF_PATH")
message(STATUS "")
message(STATUS "To proceed: ")
message(STATUS "")
message(STATUS "Remove either the local project component: ${WOLFSSH_PROJECT_DIR} ")
- message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/WOLFSSH/ ")
+ message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssh/ ")
message(STATUS "")
- message(FATAL_ERROR "Please use WOLFSSH in either local project or Espressif components, but not both.")
+ message(FATAL_ERROR "Please use wolfssh in either local project or Espressif components, but not both.")
message(STATUS "")
message(STATUS "**************************************************************************************")
message(STATUS "")
+ message(STATUS "Please use wolfSSL in either local project or Espressif components, but not both.")
+
# Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSH_MULTI_INSTALL_WARNING")
else()
- if( EXISTS "$ENV{IDF_PATH}/components/WOLFSSH/" )
+ if( EXISTS "$ENV{IDF_PATH}/components/wolfssh/" )
#
- # WOLFSSH found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup.
+ # wolfssh found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup.
#
message(STATUS "")
- message(STATUS "Using components/WOLFSSH in IDF_PATH = $ENV{IDF_PATH}")
+ message(STATUS "Using components/wolfssh in IDF_PATH = $ENV{IDF_PATH}")
message(STATUS "")
else()
#
- # WOLFSSH is not an ESP-IDF component.
- # We need to now determine if it is local and if so if it is part of the WOLFSSH repo,
- # or if WOLFSSH is simply installed as a local component.
+ # wolfssh is not an ESP-IDF component.
+ # We need to now determine if it is local and if so if it is part of the wolfssh repo,
+ # or if wolfssh is simply installed as a local component.
#
-
+ message(STATUS "Looking at WOLFSSH_PROJECT_DIR = '${WOLFSSH_PROJECT_DIR}'")
if( EXISTS "${WOLFSSH_PROJECT_DIR}" )
#
- # WOLFSSH found in local project.
+ # wolfssh found in local project.
#
- if( EXISTS "${WOLFSSH_PROJECT_DIR}/wolfcrypt/" )
+ if( EXISTS "${WOLFSSH_PROJECT_DIR}/wolfssh/" )
message(STATUS "")
- message(STATUS "Using installed project ./components/WOLFSSH in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
+ message(STATUS "Using installed project ./components/wolfssh in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
message(STATUS "")
#
- # Note we already checked above and confirmed there's not another WOLFSSH installed in the ESP-IDF components.
+ # Note we already checked above and confirmed there's not another wolfssh installed in the ESP-IDF components.
#
# We won't do anything else here, as it will be assumed the original install completed successfully.
#
- else() # full WOLFSSH not installed in local project
+ else() # full wolfssh not installed in local project
#
- # This is the developer repo mode. WOLFSSH will be assumed to be not installed to ESP-IDF nor local project
- # In this configuration, we are likely running a WOLFSSH example found directly in the repo.
+ # This is the developer repo mode. wolfssh will be assumed to be not installed to ESP-IDF nor local project
+ # In this configuration, we are likely running a wolfssh example found directly in the repo.
#
message(STATUS "")
- message(STATUS "Using developer repo ./components/WOLFSSH in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
+ message(STATUS "Using developer repo ./components/wolfssh in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
message(STATUS "")
message(STATUS "************************************************************************************************")
- # When in developer mode, we are typically running WOLFSSH examples such as benchmark or test directories.
- # However, the as-cloned or distributed WOLFSSH does not have the ./include/ directory, so we'll add it as needed.
+ # When in developer mode, we are typically running wolfssh examples such as benchmark or test directories.
+ # However, the as-cloned or distributed wolfssh does not have the ./include/ directory, so we'll add it as needed.
#
# first check if there's a [root]/include/user_settings.h
if( EXISTS "${WOLFSSH_ROOT}/include/user_settings.h" )
- message(FATAL_ERROR "Found stray WOLFSSH user_settings.h in "
+ message(FATAL_ERROR "Found stray wolfssh user_settings.h in "
"${WOLFSSH_ROOT}/include/user_settings.h "
- " (please move it to ${WOLFSSH_PROJECT_DIR}/include/user_settings.h )")
+ " (please move it to ${WOLFSSH_PROJECT_DIR}/components/wolfssl/include/user_settings.h )")
else()
# we won't overwrite an existing user settings file, just note that we already have one:
- if( EXISTS "${WOLFSSH_PROJECT_DIR}/include/user_settings.h" )
- message(STATUS "Using existing WOLFSSH user_settings.h in "
- "${WOLFSSH_PROJECT_DIR}/include/user_settings.h")
+ if( EXISTS "${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}/user_settings.h" )
+ message(STATUS "Using existing wolfssh user_settings.h in "
+ "${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}")
else()
- message(STATUS "Installing WOLFSSH user_settings.h to "
- "${WOLFSSH_PROJECT_DIR}/include/user_settings.h")
- # file(COPY "${WOLFSSH_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h"
- # DESTINATION "${CMAKE_HOME_DIRECTORY}/WOLFSSH/include/")
+ if(EXISTS "${LIB_USER_SETTINGS}" )
+ message(STATUS "Installing wolfssh user_settings.h to "
+ "${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}")
+ file(COPY "${LIB_USER_SETTINGS}"
+ DESTINATION "${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}")
+ if( EXISTS "${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}/user_settings.h" )
+ message(STATUS "Confirmed wolfssl user_settings.h in ${THIS_PROJECT_WOLFSSH_USER_SETTINGS_PATH}")
+ else()
+ message(ERROR "ERROR: Failed to copy wolfssl user_settings.h from ${LIB_USER_SETTINGS} to ${LIB_USER_SETTINGS}")
+ endif()
+ else()
+ message(ERROR "wolfssl user_settings.h not in project, and not found in ${LIB_USER_SETTINGS}")
+ endif()
endif()
endif() # user_settings.h
@@ -321,19 +547,19 @@ else()
endif()
else()
- # we did not find a ./components/WOLFSSH/include/ directory from this pass of cmake.
+ # we did not find a ./components/wolfssh/include/ directory from this pass of cmake.
if($WOLFSSH_FOUND_IDF)
message(STATUS "")
- message(STATUS "WARNING: WOLFSSH not found.")
+ message(STATUS "WARNING: wolfssh not found.")
message(STATUS "")
else()
# probably needs to be re-parsed by Espressif
- message(STATUS "WOLFSSH found IDF. Project Source:${PROJECT_SOURCE_DIR}")
+ message(STATUS "wolfssh found IDF. Project Source:${PROJECT_SOURCE_DIR}")
endif() # else we have not found ESP-IDF yet
- endif() # else not a local WOLFSSH component
+ endif() # else not a local wolfssh component
endif() #else not an ESP-IDF component
- endif() # else not local copy and EDP-IDF WOLFSSH
+ endif() # else not local copy and EDP-IDF wolfssh
# RTOS_IDF_PATH is typically:
@@ -422,17 +648,17 @@ else()
message(STATUS "")
endif()
- # target_sources(WOLFSSH PRIVATE "\"${WOLFSSH_ROOT}/WOLFSSH/\"" "\"${WOLFSSH_ROOT}/WOLFSSH/wolfcrypt\"")
+ # target_sources(wolfssh PRIVATE "\"${WOLFSSH_ROOT}/wolfssh/\"" "\"${WOLFSSH_ROOT}/wolfssh/wolfcrypt\"")
endif() # CMAKE_BUILD_EARLY_EXPANSION
-# check to see if there's both a local copy and EDP-IDF copy of the WOLFSSH components
-if( EXISTS "${WOLFSSH_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/WOLFSSH/" )
+# check to see if there's both a local copy and EDP-IDF copy of the wolfssh components
+if( EXISTS "${WOLFSSH_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssh/" )
message(STATUS "")
message(STATUS "")
message(STATUS "********************************************************************")
- message(STATUS "WARNING: Found components/WOLFSSH in both local project and IDF_PATH")
+ message(STATUS "WARNING: Found components/wolfssh in both local project and IDF_PATH")
message(STATUS "********************************************************************")
message(STATUS "")
endif()
@@ -502,6 +728,6 @@ if(NOT CMAKE_BUILD_EARLY_EXPANSION)
LIBWOLFSSH_SAVE_INFO(LIBWOLFSSH_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}")
message(STATUS "************************************************************************************************")
- message(STATUS "WOLFSSH component config complete!")
+ message(STATUS "wolfssh component config complete!")
message(STATUS "************************************************************************************************")
endif()
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssh/README.md b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssh/README.md
new file mode 100644
index 00000000..5f69e1b8
--- /dev/null
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssh/README.md
@@ -0,0 +1,3 @@
+# wolfSSH Component
+
+All related settings are in the wolfSSL component.
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/CMakeLists.txt b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/CMakeLists.txt
index 6ee31d2b..4a0ab068 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/CMakeLists.txt
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/CMakeLists.txt
@@ -1,5 +1,5 @@
#
-# Copyright (C) 2014-2024 wolfSSL Inc.
+# Copyright (C) 2014-2025 wolfSSL Inc.
#
# This file is part of wolfSSH.
#
@@ -18,30 +18,195 @@
#
# cmake for wolfssl Espressif projects
#
-# Version 5.7.0 template update + THIS_IDF_PATH
+# Version 5.8.0 Espressif ESP-IDF + PlatformIO integration (2)
#
# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html
#
-
+message(STATUS "Begin wolfssl ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT}")
cmake_minimum_required(VERSION 3.16)
-set(VERBOSE_COMPONENT_MESSAGES 1)
-
# The scope of this CMAKE_C_FLAGS is just this component:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWOLFSSL_USER_SETTINGS")
set(CMAKE_CURRENT_SOURCE_DIR ".")
-# set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component
# Optionally set your source to wolfSSL in your project CMakeLists.txt like this:
-# set(WOLFSSL_ROOT "c:/test/my_wolfssl" )
+# set(WOLFSSL_ROOT "c:/workspace/my_wolfssl" )
if ( "${WOLFSSL_ROOT}" STREQUAL "")
set(WOLFSSL_ROOT "$ENV{WOLFSSL_ROOT}" )
endif()
+set(VERBOSE_COMPONENT_MESSAGES 1)
+
+# Optional requires include:
+# set(THIS_ESP_TLS "esp-tls")
+set(THIS_ESP_TLS "")
+
+# LIBWOLFSSL_CMAKE_OUTPUT can be printed at runtime
+set(LIBWOLFSSL_CMAKE_OUTPUT "")
+
+
+if(CMAKE_BUILD_EARLY_EXPANSION)
+ message(STATUS "Skipping libwolfssl_output.h update during CMAKE_BUILD_EARLY_EXPANSION")
+else()
+ # Initialize a new libwolfssl_output.h in the cmake build directory.
+ if( EXISTS "${CMAKE_BINARY_DIR}/libwolfssl_output.h")
+ # The next WRITE replaces a file.
+ # This is here to remove any ambiguity on file removal & generation.
+ file(REMOVE "${CMAKE_BINARY_DIR}/libwolfssl_output.h")
+ endif()
+
+ file(WRITE "${CMAKE_BINARY_DIR}/libwolfssl_output.h"
+ "/* libwolfssl_output.h generated by wolfssl component */\n"
+ "#ifndef _LIBWOLFSSL_OUTPUT_H_\n"
+ "\n"
+ "#define _LIBWOLFSSL_OUTPUT_H_\n\n")
+endif()
+
+# Append messages with:
+# LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_CMAKE_OUTPUT "${LIBWOLFSSL_CMAKE_OUTPUT}\n"message" "0")
+# See function: APPEND_LIBWOLFSSL_CMAKE_OUTPUT
+
+# function: IS_ESP_IDF_COMPONENT
+# output: RESULT = 1 (true) if this component is located in the ESP-IDF components
+# otherwise 0 (false)
+function( IS_ESP_IDF_COMPONENT
+ RESULT)
+ # NOTE: Component location is based on the location of the CMakeList.txt
+ # and *not* the location of the wolfSSL source code. (which may be anywhere)
+
+ # Normalize the paths to remove any trailing slashes
+ get_filename_component(NORMALIZED_IDF_PATH "${IDF_PATH}" REALPATH)
+ get_filename_component(NORMALIZED_TEST_PATH "${COMPONENT_DIR}" REALPATH)
+
+ # Check if the test path starts with the IDF_PATH
+ string(FIND "${NORMALIZED_TEST_PATH}" "${NORMALIZED_IDF_PATH}" pos)
+
+ if(${pos} EQUAL 0)
+ message(STATUS "${COMPONENT_DIR} is within IDF_PATH.")
+ set(${RESULT} 1 PARENT_SCOPE)
+ else()
+ message(STATUS "${COMPONENT_DIR} is not within IDF_PATH.")
+ set(${RESULT} 0 PARENT_SCOPE)
+ endif()
+endfunction()
+
+#
+# LIBWOLFSSL_SAVE_INFO(VAR_OUTPUT THIS_VAR VAR_RESULT)
+#
+# Save the THIS_VAR as a string in a macro called VAR_OUTPUT
+#
+# VAR_OUTPUT: the name of the macro to define
+# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process()
+# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful.
+#
+function ( LIBWOLFSSL_SAVE_INFO VAR_OUTPUT THIS_VAR VAR_RESULT )
+ # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true.
+ string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE)
+
+ # if we had a successful operation, save the THIS_VAR in VAR_OUTPUT
+ if(${IS_VALID_VALUE})
+
+ if(0)
+ # Optional debug
+ message(STATUS "Looking for LF in ${THIS_VAR}")
+ endif()
+
+ # Check if the text to print in THIS_VAR is multi-line
+ string(REPLACE "\n" ";" LINES "${THIS_VAR}")
+ list(LENGTH LINES LINE_COUNT)
+
+ # Save var to "libwolfssl_output.h" header if multi-line, otherwise a simple compile def
+ if(LINE_COUNT GREATER 1)
+ message(STATUS "Setting HAVE_LIBWOLFSSL_OUTPUT_HEADER=1 for ${VAR_OUTPUT}")
+ add_compile_definitions(HAVE_LIBWOLFSSL_OUTPUT_HEADER=1)
+ file(APPEND "${CMAKE_BINARY_DIR}/libwolfssl_output.h" "#undef ${VAR_OUTPUT}\n")
+ file(APPEND "${CMAKE_BINARY_DIR}/libwolfssl_output.h" "#define ${VAR_OUTPUT} \\\n")
+
+ # Split into lines
+ string(REPLACE "\n" ";" LINES "${THIS_VAR}")
+ foreach(LINE IN LISTS LINES)
+ file(APPEND "${CMAKE_BINARY_DIR}/libwolfssl_output.h" "\"${LINE}\\n\" \\\n")
+ endforeach()
+
+ # Final empty line to close the macro
+ file(APPEND "${CMAKE_BINARY_DIR}/libwolfssl_output.h" "\n")
+
+ message(STATUS "COMPONENT_LIB=${COMPONENT_LIB}")
+ target_include_directories(${COMPONENT_LIB} PRIVATE "${CMAKE_BINARY_DIR}")
+ else()
+ message(STATUS "No HAS_LIBWOLFSSL_OUTPUT_HEADER")
+ # We should not have any, but just to be sure:
+ # Strip newline chars in THIS_VAR parameter and save in VAR_VALUE
+ string(REPLACE "\n" "" VAR_VALUE "${THIS_VAR}")
+
+ # we'll could percolate the value to the parent for possible later use
+ # set(${VAR_OUTPUT} ${VAR_VALUE} PARENT_SCOPE)
+
+ # but we're only using it here in this function
+ set(${VAR_OUTPUT} ${VAR_VALUE})
+
+ # we'll print what we found to the console
+ message(STATUS "Found ${VAR_OUTPUT}=${VAR_VALUE}")
+
+ # the interesting part is defining the VAR_OUTPUT name a value to use in the app
+ add_compile_definitions(${VAR_OUTPUT}=\"${VAR_VALUE}\")
+
+ endif()
+ else()
+ # if we get here, check the execute_process command and parameters.
+ message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT")
+ set(${VAR_OUTPUT} "Unknown")
+ endif()
+
+
+endfunction() # LIBWOLFSSL_SAVE_INFO
+
+#
+# APPEND_LIBWOLFSSL_CMAKE_OUTPUT(THIS_MESSAGE OUTPUT_VALUE)
+#
+# Append the text in THIS_MESSAGE to LIBWOLFSSL_CMAKE_OUTPUT.
+# String is available at runtime in app
+#
+
+function( APPEND_LIBWOLFSSL_CMAKE_OUTPUT
+ THIS_MESSAGE )
+ # Normally, we'd simply print a message:
+ message(STATUS "${THIS_MESSAGE}")
+
+ # But here we'll pass the entire LIBWOLFSSL_CMAKE_OUTPUT as a string definition to the app
+ set(LIBWOLFSSL_CMAKE_OUTPUT "${LIBWOLFSSL_CMAKE_OUTPUT}\n${THIS_MESSAGE}" PARENT_SCOPE)
+
+ # We don't call LIBWOLFSSL_SAVE_INFO here as it would add duplicate definitions
+ # See single instance at the end of this file.
+endfunction()
+
+# Determine if this cmake file is located in the ESP-IDF component directory or not,
+# and if so, if it is being ignored (allowing the use of a local project one, instead).
+IS_ESP_IDF_COMPONENT( IS_WOLSSL_ESP_IDF_COMPONENT )
+if( IS_WOLSSL_ESP_IDF_COMPONENT )
+ message(STATUS "This wolfSSL is a component in ESP-IDF.")
+ if ( CONFIG_IGNORE_ESP_IDF_WOLFSSL_COMPONENT )
+ idf_component_register()
+ message(STATUS "Warning: wolfSSL component in ESP-IDF is being ignored.")
+ return()
+ endif()
+endif()
+
+
+if( "${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT}" STREQUAL "" )
+ # nothing to do
+else()
+ # Only forward slashes, or double backslashes are supported.
+ # By the time we get here the sdkconfig file has a value for wolfSSL source code root.
+ string(REPLACE "\\" "/" CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT})
+ message(STATUS "Cleaned wolfssl path: ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT}")
+endif()
+
if( "$ENV{IDF_PATH}" STREQUAL "" )
- message(FATAL_ERROR "IDF_PATH Environment variable not set!")
+ message(FATAL_ERROR "IDF_PATH Environment variable not set!")
else()
string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}")
endif()
@@ -51,28 +216,28 @@ if(VERBOSE_COMPONENT_MESSAGES)
if(WIN32)
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS")
- message("Detected Windows")
+ message(STATUS "Detected Windows")
endif()
if(CMAKE_HOST_UNIX)
- message("Detected UNIX")
+ message(STATUS "Detected UNIX")
endif()
if(APPLE)
- message("Detected APPLE")
+ message(STATUS "Detected APPLE")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop")
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL")
- message("Detected WSL")
+ message(STATUS "Detected WSL")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32))
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX")
- message("Detected Linux")
+ message(STATUS "Detected Linux")
endif()
if(APPLE)
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE")
- message("Detected Apple")
+ message(STATUS "Detected Apple")
endif()
endif() # End optional WOLFSSL_CMAKE_SYSTEM_NAME
@@ -105,10 +270,11 @@ if( ("${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_benchmark") OR ("${CMAKE_PROJECT_
message(STATUS "Not including lwip for ${CMAKE_PROJECT_NAME}")
else()
# benchmark and test do not need wifi, everything else probably does:
- set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component
+ set(COMPONENT_REQUIRES lwip "${THIS_ESP_TLS}") # we typically don't need lwip directly in wolfssl component
endif()
-# find the user name to search for possible "wolfssl-username"
+# Find the user name to search for possible "wolfssl-username"
+# Reminder: Windows is %USERNAME%, Linux is $USER
message(STATUS "USERNAME = $ENV{USERNAME}")
if( "$ENV{USER}" STREQUAL "" ) # the bash user
if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user
@@ -123,6 +289,32 @@ else()
endif()
message(STATUS "THIS_USER = ${THIS_USER}")
+if( "$ENV{IDF_PATH}" STREQUAL "" )
+ message(FATAL_ERROR "IDF_PATH Environment variable not set!")
+else()
+ string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}")
+endif()
+
+# ENVIRONMENT_VAR_TO_MACRO
+# Check environment variable name EVARPARAM as [name]
+# If defined, and has a value of EVARVALUE as [value],
+# then assign a compiler definition "-D[name]=[value]"
+function( ENVIRONMENT_VAR_TO_MACRO
+ EVARPARAM # Environment variable parameter name
+ EVARVALUE) # Environment variable value
+ # If the EVARPARAM environment variable name is set to EVARVALUE,
+ # set the compiler flag definition to enable CSV output.
+ if ( "$ENV{${EVARPARAM}}" STREQUAL "${EVARVALUE}")
+ message(STATUS "Appending compile definition: -D${EVARPARAM}=${EVARVALUE}")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D${EVARPARAM}=${EVARVALUE}")
+ else()
+ if(DEFINED ENV{${EVARPARAM}})
+ message(STATUS "Environment variable ${EVARPARAM} detected but set to $ENV{${EVARPARAM}}, not appending compile definition.")
+ else()
+ message(STATUS "Environment variable ${EVARPARAM} not detected, not appending compile definition.")
+ endif()
+ endif()
+endfunction()
# COMPONENT_NAME = wolfssl
# The component name is the directory name. "No feature to change this".
@@ -141,7 +333,9 @@ message(STATUS "THIS_USER = ${THIS_USER}")
# function: IS_WOLFSSL_SOURCE
# parameter: DIRECTORY_PARAMETER - the directory to test
# output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssl directory, otherwise blank.
-function(IS_WOLFSSL_SOURCE DIRECTORY_PARAMETER RESULT)
+function( IS_WOLFSSL_SOURCE
+ DIRECTORY_PARAMETER
+ RESULT )
if (EXISTS "${DIRECTORY_PARAMETER}/wolfcrypt/src")
set(${RESULT} "${DIRECTORY_PARAMETER}" PARENT_SCOPE)
else()
@@ -156,30 +350,61 @@ endfunction()
# Example usage:
# FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
# *********************************************************************************************
-function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY)
+function( FIND_WOLFSSL_DIRECTORY
+ OUTPUT_FOUND_WOLFSSL_DIRECTORY)
message(STATUS "Starting FIND_WOLFSSL_DIRECTORY: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}")
if ( "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}" STREQUAL "" )
+ # The parameter is empty, so we certainly need to search.
+ # First, see if there's an environment variable. This takes highest priority (unless already found as hard-coded, above)
set(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}")
if( "${CURRENT_SEARCH_DIR}" STREQUAL "" )
message(STATUS "The WOLFSSL_ROOT environment variable is not set. Searching...")
- else()
- get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE)
- IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL)
- if( FOUND_WOLFSSL )
- message(STATUS "Found WOLFSSL_ROOT via Environment Variable:")
+ # Next, if not found, see if wolfSSL was selected for ESP-TLS Kconfig
+ if(CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT)
+ set(CURRENT_SEARCH_DIR ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT})
+ get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" ABSOLUTE)
+ message(STATUS "WOLFSSL_ROOT found in sdkconfig/KConfig: ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT}")
else()
- message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:")
- message(STATUS "$ENV{WOLFSSL_ROOT}")
- endif()
- endif()
+ message(STATUS "wolfSSL not defined in [Component Config] [wolfssl]. Continuing search...")
+ # If not specified as a search hint in OUTPUT_FOUND_WOLFSSL_DIRECTORY:
+ # This wolfSSL component CMakeLists.txt may be found EITHER in:
+ # 1) local project component
+ # 2) ESP-IDF share components
+ # We'll start in the CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssl
+ # That option might find wolfSSL source code as a copy in the component directory (e.g. Managed Components)
+ # Unless cmake is in the ESP-IDF, in which case it is unlikely to find wolfSSL source in any parent.
+ message(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
+ get_filename_component(CURRENT_SEARCH_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
+ message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
+ string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH)
+ endif() # CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT
+ endif() # check environment var blank
else()
- get_filename_component(CURRENT_SEARCH_DIR "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}" ABSOLUTE)
+ message(STATUS "Parameter found for FIND_WOLFSSL_DIRECTORY")
+ message(STATUS "Setting wolfSSL search directory to: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}")
+ set(CURRENT_SEARCH_DIR "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}")
+ endif() # parameter empty
+
+ # Check to see if we found a path in environment or config settings, above.
+ if( "${CURRENT_SEARCH_DIR}" STREQUAL "" )
+ message(STATUS "Source for wolfSSL not specified in path nor config settings.")
+ # We'll continue the search by recursing up the directory tree, below.
+ else()
+ # Setting found! Does it contain a valid path?
+ string(REPLACE "\\" "/" CURRENT_SEARCH_DIR ${CURRENT_SEARCH_DIR})
+ get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" ABSOLUTE)
IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL)
if( FOUND_WOLFSSL )
- message(STATUS "Found WOLFSSL_ROOT via prior specification.")
+ message(STATUS "Found wolfSSL source code via setting: ${CURRENT_SEARCH_DIR}")
+ set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
+ return()
else()
- message(FATAL_ERROR "WOLFSSL_ROOT Variable defined, but path not found: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}")
+ if(WIN32)
+ message(STATUS "When specifying a path for Windows, use forward slahes, or double backslashes.")
+ endif()
+ message(STATUS "CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT sdkconfig setting = ${CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT}")
+ message(STATUS "WOLFSSL_ROOT Variable defined, but source code not found: ${CURRENT_SEARCH_DIR}")
endif()
endif()
@@ -280,6 +505,11 @@ endfunction()
message(STATUS "CONFIG_TARGET_PLATFORM = ${CONFIG_TARGET_PLATFORM}")
+# Check for environment variable that may be assigned to macros
+ENVIRONMENT_VAR_TO_MACRO("GENERATE_MACHINE_PARSEABLE_REPORT" "1")
+ENVIRONMENT_VAR_TO_MACRO("WOLFSSL_BENCHMARK_FIXED_CSV" "1")
+
+# Optional variable inspection
if (0)
get_cmake_property(_variableNames VARIABLES)
list (SORT _variableNames)
@@ -296,15 +526,25 @@ endif()
if ( ("${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266") OR ("${IDF_TARGET}" STREQUAL "esp8266") )
# There's no esp_timer, no driver components for the ESP8266
- message(STATUS "Early expansion EXCLUDES esp_timer: ${THIS_INCLUDE_TIMER}")
- message(STATUS "Early expansion EXCLUDES driver: ${THIS_INCLUDE_DRIVER}")
- set(THIS_INCLUDE_TIMER "")
- set(THIS_INCLUDE_DRIVER "")
+ message(STATUS "Early expansion EXCLUDES for esp8266:")
+ message(STATUS "THIS_INCLUDE_DRIVER: '${THIS_INCLUDE_DRIVER}'")
+ message(STATUS "THIS_INCLUDE_TIMER: '${THIS_INCLUDE_TIMER}'")
+ message(STATUS "Early expansion INCLUDE for esp8266:")
+ message(STATUS "THIS_INCLUDE_PTHREAD: '${THIS_INCLUDE_PTHREAD}'")
+ set(THIS_ESP_TLS "")
+ set(THIS_INCLUDE_DRIVER "")
+ set(THIS_INCLUDE_TIMER "")
+ set(THIS_INCLUDE_PTHREAD "pthread")
else()
message(STATUS "Early expansion includes esp_timer: ${THIS_INCLUDE_TIMER}")
message(STATUS "Early expansion includes driver: ${THIS_INCLUDE_DRIVER}")
- set(THIS_INCLUDE_TIMER "esp_timer")
+ set(THIS_ESP_TLS "esp-tls")
set(THIS_INCLUDE_DRIVER "driver")
+ set(THIS_INCLUDE_TIMER "esp_timer")
+ set(THIS_INCLUDE_PTHREAD "")
+ # Let the app know that we've included the esp-tls component requirement.
+ # This is critical for use the the esp-tls component. See wolfssl esp_crt_bundle.c file.
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_REQUIRED_ESP_TLS=1")
endif()
if(CMAKE_BUILD_EARLY_EXPANSION)
@@ -312,8 +552,10 @@ if(CMAKE_BUILD_EARLY_EXPANSION)
idf_component_register(
REQUIRES "${COMPONENT_REQUIRES}"
PRIV_REQUIRES # esp_hw_support
- ${THIS_INCLUDE_TIMER}
- ${THIS_INCLUDE_DRIVER} # this will typically only be needed for wolfSSL benchmark
+ "${THIS_ESP_TLS}"
+ "${THIS_INCLUDE_PTHREAD}"
+ "${THIS_INCLUDE_TIMER}"
+ "${THIS_INCLUDE_DRIVER}" # this will typically only be needed for wolfSSL benchmark
)
else()
@@ -322,6 +564,15 @@ else()
message(STATUS "wolfssl component config:")
message(STATUS "************************************************************************************************")
+ if ( "${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266")
+ # There's no esp_timer, no driver components for the ESP8266
+ set(THIS_INCLUDE_TIMER "")
+ set(THIS_INCLUDE_DRIVER "")
+ else()
+ set(THIS_INCLUDE_TIMER "esp_timer")
+ set(THIS_INCLUDE_DRIVER "driver")
+ endif()
+
# search for wolfSSL
FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
if(WOLFSSL_ROOT)
@@ -335,7 +586,9 @@ else()
# Abort CMake after fatal error.
endif()
else()
- message(STATUS "Searching for wolfSL source code...")
+ message(STATUS "Source code for wolfSSL still not found.")
+ message(STATUS "Searching from project home: ${CMAKE_HOME_DIRECTORY} ...")
+ set(WOLFSSL_ROOT "${CMAKE_HOME_DIRECTORY}")
FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
endif()
@@ -343,11 +596,18 @@ else()
if(WOLFSSL_ROOT)
message(STATUS "Confirmed wolfssl directory at: ${WOLFSSL_ROOT}")
else()
- message(STATUS "Failed: wolfssl directory not found.")
+ # Try to allow a more intuitive error that the source code was not found in cmake:
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_WARNING_SOURCE_NOT_FOUND")
+
+ message(STATUS "Failed: wolfssl source code directory not found.")
# Abort. We need wolfssl _somewhere_.
- message(FATAL_ERROR "Could not find wolfssl in any parent directory named wolfssl-${THIS_USER}, wolfssl-master, or wolfssl.\n"
- "Try setting WOLFSSL_ROOT environment variable, cmake variable in project, copy source, or use managed components.")
- # Abort CMake after fatal error.
+ message(STATUS "")
+ message(STATUS "")
+ message(STATUS "Could not find wolfssl in any parent directory named wolfssl-${THIS_USER}, wolfssl-master, or wolfssl.\n"
+ "Try setting WOLFSSL_ROOT environment variable, cmake variable in project, copy source, or use managed components.")
+ message(STATUS "")
+ message(STATUS "")
+ # Abort CMake after fatal error. (or not?)
endif()
set(INCLUDE_PATH ${WOLFSSL_ROOT})
@@ -373,22 +633,24 @@ else()
endif()
endif()
+ message(STATUS "WOLFSSL_EXTRA_PROJECT_DIR = ${WOLFSSL_EXTRA_PROJECT_DIR}")
set(COMPONENT_SRCDIRS "\"${WOLFSSL_ROOT}/src/\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif\""
+ "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif/esp_crt_bundle\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel\""
"\"${WOLFSSL_EXTRA_PROJECT_DIR}\""
) # COMPONENT_SRCDIRS
message(STATUS "This COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}")
- # wolfSSL user_settings.h is in the local project.
+ # wolfSSL user_settings.h may be in the local project.
+ # TODO check if exists and possibly set to ESP-IDF
set(WOLFSSL_PROJECT_DIR "${CMAKE_HOME_DIRECTORY}/components/wolfssl")
- # add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${WOLFSSL_PROJECT_DIR}/include/user_settings.h")
string(REPLACE "/" "//" STR_WOLFSSL_PROJECT_DIR "${WOLFSSL_PROJECT_DIR}")
- add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${STR_WOLFSSL_PROJECT_DIR}//include//user_settings.h")
-
+ add_compile_definitions(WOLFSSL_USER_SETTINGS_DIR="${STR_WOLFSSL_PROJECT_DIR}/include/user_settings.h")
+ message(STATUS "Added definition for user_settings.h: -DWOLFSSL_USER_SETTINGS_DIR=\"${STR_WOLFSSL_PROJECT_DIR}//include//user_settings.h\"")
# Espressif may take several passes through this makefile. Check to see if we found IDF
string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF)
@@ -421,8 +683,7 @@ else()
message(STATUS "**************************************************************************************")
message(STATUS "")
- message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.")
- # Abort CMake after fatal error.
+ message(STATUS "Please use wolfSSL in either local project or Espressif components, but not both.")
# Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING")
@@ -530,7 +791,9 @@ else()
# depending on the environment, we may need to swap backslashes with forward slashes
string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos")
- string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT})
+ if(WOLFSSL_ROOT)
+ string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT})
+ endif()
if(IS_DIRECTORY "${RTOS_IDF_PATH}")
message(STATUS "Found current RTOS path: ${RTOS_IDF_PATH}")
@@ -546,12 +809,16 @@ else()
message(STATUS "THIS_IDF_PATH = $THIS_IDF_PATH")
# wolfSSL-specific include directories
set(COMPONENT_ADD_INCLUDEDIRS
- "./include" # this is the location of wolfssl user_settings.h
+ "./include" # this is the location of local project wolfssl user_settings.h
"\"${WOLFSSL_ROOT}/\""
"\"${WOLFSSL_ROOT}/wolfssl/\""
"\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\""
"\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/port/Espressif\""
"\"${RTOS_IDF_PATH}/\""
+ # wolfSSL release after v5.7 includes WiFi, time, and mem/debug helpers
+ "${THIS_IDF_PATH}/components/esp_event/include"
+ "${THIS_IDF_PATH}/components/esp_netif/include"
+ "${THIS_IDF_PATH}/components/esp_wifi/include"
)
# Optionally include cryptoauthlib if present
@@ -579,8 +846,8 @@ else()
"\"${WOLFSSL_ROOT}/src/ssl_sess.c\"" # included by ssl.c
"\"${WOLFSSL_ROOT}/src/x509.c\""
"\"${WOLFSSL_ROOT}/src/x509_str.c\""
- "\"${WOLFSSL_ROOT}/wolfcrypt/src/ext_kyber.c\"" # external Kyber disabled by default
- "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/ext_kyber.h\"" # external Kyber disabled by default
+ "\"${WOLFSSL_ROOT}/wolfcrypt/src/ext_kyber.c\"" # external non-wolfssl Kyber disabled by default
+ "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/ext_kyber.h\"" # external non-wolfssl Kyber disabled by default
"\"${WOLFSSL_ROOT}/wolfcrypt/src/evp.c\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/misc.c\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm32.c\""
@@ -591,6 +858,7 @@ else()
"\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_cortexm.c\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64.c\""
"\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64_asm.S\""
+ "\"${WOLFSSL_ROOT}/examples\"" # Examples are distributed in Managed Components, but not part of a project.
"\"${EXCLUDE_ASM}\""
)
@@ -612,15 +880,226 @@ else()
# see https://docs.espressif.com/projects/esp-idf/en/stable/esp32/migration-guides/release-5.x/build-system.html?highlight=space%20path
#
set(EXTRA_COMPONENT_DIRS "${COMPONENT_SRCDIRS}")
- idf_component_register(
- SRC_DIRS "${COMPONENT_SRCDIRS}"
- INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}"
- REQUIRES "${COMPONENT_REQUIRES}"
- EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}"
- PRIV_REQUIRES
- "${THIS_INCLUDE_TIMER}"
- "${THIS_INCLUDE_DRIVER}" # this will typically only be needed for wolfSSL benchmark
- )
+
+ if(WOLFSSL_ROOT)
+ # Only register the component if we found wolfSSL source.
+ # This is important to allow Cmake to finish to completion, otherwise the UI
+ # may not be able to display the Kconfig settings to fix a bad or missing source.
+ idf_component_register(
+ SRC_DIRS "${COMPONENT_SRCDIRS}"
+ INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}"
+ REQUIRES "${COMPONENT_REQUIRES}"
+ EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}"
+ PRIV_REQUIRES
+ "${THIS_ESP_TLS}"
+ "${THIS_INCLUDE_TIMER}"
+ "${THIS_INCLUDE_DRIVER}" # this will typically only be needed for wolfSSL benchmark
+ )
+ else()
+ # Register the component simply to allow CMake to complete, but there's no wolfSSL source.
+ # Expect many other errors, but the project should at least be loadable and UI can edit Kconfig settings.
+ idf_component_register()
+ message(STATUS "Warning: wolfSSL component not registered as no source code found (WOLFSSL_ROOT is blank)")
+ endif()
+
+# function(WOLFSSL_INIT_CERT_BUNDLE)
+if( CONFIG_WOLFSSL_CERTIFICATE_BUNDLE
+ AND NOT CONFIG_WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_NONE
+ AND NOT ("${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266")
+ )
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("wolfSSL Certificate Bundles Enabled")
+
+ if (CMAKE_BUILD_EARLY_EXPANSION)
+ message(FATAL_ERROR "Bundle Cert initialization must occur during CMAKE_BUILD_EARLY_EXPANSION")
+ endif()
+ # reminder: we need a value for wolfSSL root first!
+ if( "${WOLFSSL_ROOT}" STREQUAL "" )
+ message(FATAL_ERROR "Certificate bundles need a value for WOLFSSL_ROOT")
+ endif()
+
+ # Cert bundle in wolfSSL source unless otherwise specified later
+ set(WOLFSSL_ESP_CRT_BUNDLE_DIR ${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif/esp_crt_bundle)
+ message(STATUS "WOLFSSL_ESP_CRT_BUNDLE_DIR=${WOLFSSL_ESP_CRT_BUNDLE_DIR}")
+
+ if(DEFINED ENV{PLATFORMIO_PROJECT_DIR})
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Detected PlatformIO")
+ set(IS_PLATFORMIO 1)
+ else()
+ # Some environments may not have environment variable, so double check if we are in .pio
+ if("${CMAKE_BINARY_DIR}" MATCHES "/\\.pio/")
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Detected PlatformIO via CMAKE_BINARY_DIR")
+ set(IS_PLATFORMIO 1)
+ else()
+ set(IS_PLATFORMIO 0)
+ endif()
+ endif()
+
+ if(EXISTS "${WOLFSSL_ESP_CRT_BUNDLE_DIR}" OR IS_PLATFORMIO)
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Special processing for wolfSSL Certificate Bundles")
+ set(bundle_name "x509_crt_bundle_wolfssl")
+
+ # For now the certs are in the same directory
+ set(DEFAULT_CRT_DIR "${WOLFSSL_ESP_CRT_BUNDLE_DIR}")
+
+ # Generate custom certificate bundle using the generate_cert_bundle utility
+ set(GENERATE_CERT_BUNDLEPY ${python} ${WOLFSSL_ESP_CRT_BUNDLE_DIR}/gen_crt_bundle.py)
+
+ if(CONFIG_WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_FULL)
+ list(APPEND crt_paths ${DEFAULT_CRT_DIR}/cacrt_all.pem ${DEFAULT_CRT_DIR}/cacrt_local.pem)
+ elseif(CONFIG_WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_CMN)
+ list(APPEND crt_paths ${DEFAULT_CRT_DIR}/cacrt_all.pem ${DEFAULT_CRT_DIR}/cacrt_local.pem)
+ list(APPEND args --filter ${DEFAULT_CRT_DIR}/cmn_crt_authorities.csv)
+ endif()
+
+ # Add deprecated root certs if enabled. This config is not visible if the default cert
+ # bundle is not selected
+ if(CONFIG_WOLFSSL_CERTIFICATE_BUNDLE_DEPRECATED_LIST)
+ list(APPEND crt_paths ${DEFAULT_CRT_DIR}/cacrt_deprecated.pem)
+ endif()
+
+ if(CONFIG_WOLFSSL_CUSTOM_CERTIFICATE_BUNDLE)
+ get_filename_component(custom_bundle_path
+ ${CONFIG_WOLFSSL_CUSTOM_CERTIFICATE_BUNDLE_PATH} ABSOLUTE BASE_DIR "${project_dir}")
+ list(APPEND crt_paths ${custom_bundle_path})
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Using a custom wolfSSL bundle path: ${custom_bundle_path}")
+ else()
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Not using a custom wolfSSL bundle path")
+ endif()
+ list(APPEND args --input ${crt_paths} -q)
+
+ message(STATUS "CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")
+ get_filename_component(crt_bundle
+ ${bundle_name}
+ ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+
+ message(STATUS "Setting up bundle generate: ${GENERATE_CERT_BUNDLEPY} ${args}")
+ message(STATUS "Depends on custom bundle path: ${custom_bundle_path}")
+ message(STATUS "crt_bundle ${crt_bundle}")
+ message(STATUS "COMPONENT_LIB ${COMPONENT_LIB}")
+ message(STATUS "GENERATE_CERT_BUNDLEPY ${GENERATE_CERT_BUNDLEPY}")
+ message(STATUS "args ${args}")
+ message(STATUS "cert_bundle ${cert_bundle}")
+
+ if (IS_PLATFORMIO)
+ # PlatformIO cannot generate a Certificate Bundle at build time
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("PlatformIO is using a predefined bundle rather than generating one")
+
+ if ( "${WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}" STREQUAL "" OR "$(WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE)" STREQUAL "" OR "$(WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE)" STREQUAL "n")
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Alternate Certificate Bundle Path and Name not enabled, assuming [project]/certs/x509_crt_bundle_wolfssl")
+ # Reminder this CMakeLists.txt should be in [project]/components/wolfssl, so ./certs is two directories up
+ set(crt_bundle_option "../../certs/x509_crt_bundle_wolfssl")
+ else()
+ string(SUBSTRING "${CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}" 0 2 CERT_PATH_FIRST_TWO)
+ if(CERT_PATH_FIRST_TWO STREQUAL "./" OR CERT_PATH_FIRST_TWO STREQUAL ".\\")
+ set(IS_CERT_BUNDLE_RELATIVE_PATH 1)
+ message(STATUS "Alternate Cert Path is relative to project.")
+ else()
+ set(IS_CERT_BUNDLE_RELATIVE_PATH 0)
+ message(STATUS "Alternate Cert Path is not relative to project.")
+ endif()
+
+ # The cert bundle is not a standard cert, so we con't add to the crt_paths.
+ # Still, we may have an alternate location, particulatly needed for PlatformIO:
+ if(IS_CERT_BUNDLE_RELATIVE_PATH)
+ message(STATUS "CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME = ${CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}")
+ message(STATUS "Relative alternate_bundle_path: ${alternate_bundle_path}")
+
+ SET(crt_bundle_option "${CMAKE_SOURCE_DIR}/${CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}")
+ else()
+ message(STATUS "alternate_bundle_path: ${CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}")
+ message(STATUS "Not using an alternate wolfSSL bundle file.")
+ SET(crt_bundle_option "${CONFIG_WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME}")
+ endif()
+ endif()
+
+ # Clean the path, removing any extra "./" etc.
+ # Number of spaces in message strings is to align path value outputs
+ message(STATUS "This crt_bundle_option value: ${crt_bundle_option}")
+ if(${CMAKE_VERSION} VERSION_LESS "3.19")
+ message("WARNING: CMake version is ${CMAKE_VERSION} ? file(REAL_PATH ...) is not supported. Falling back to manual path normalization.")
+ # optional fallback logic here
+ get_filename_component(crt_bundle_file_component "${crt_bundle_option}" ABSOLUTE)
+ message(STATUS "Interim crt_bundle_file_component: ${crt_bundle_file_component}")
+ file(TO_CMAKE_PATH "${crt_bundle_file_component}" crt_bundle)
+ message(STATUS "TO_CMAKE_PATH crt_bundle result: ${crt_bundle}")
+ # set(crt_bundle "C:/workspace/pio_wolfssl-upstream-test-wolfssl_cert_bundle/esp32-c6/certs/x509_crt_bundle_wolfssl")
+ else()
+ file(REAL_PATH "${crt_bundle_option}" crt_bundle)
+ endif()
+
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Certificate Bundle: ${crt_bundle}")
+ message(STATUS "This cleaned crt_bundle value: ${crt_bundle}")
+ message(STATUS "=============================================================================================================")
+ message(STATUS "=============================================================================================================")
+ message(STATUS "Reminder: platformio.ini will need this value set for board_build.embed_files =")
+ message(STATUS "${crt_bundle}")
+ message(STATUS "=============================================================================================================")
+ message(STATUS "=============================================================================================================")
+
+ # e.g. SET(crt_bundle "C:/workspace/pio_wolfssl/esp32-c6/certs/x509_crt_bundle_wolfssl")
+ #
+
+ # Normally x509_crt_bundle_wolfssl built by python script called from cmake.
+ # See https://github.com/wolfSSL/wolfssl/blob/master/wolfcrypt/src/port/Espressif/esp_crt_bundle/gen_crt_bundle.py
+ # Reminder ESP-IDF scripts are NOT called from CMake for PlatformIO builds.
+ #
+ # The easiest way to generate the default file is to build with ESP-IDF and copy the files to [project]/main
+ #
+ # for example:
+ # build\VisualGDB\Debug\x509_crt_bundle_wolfssl.s
+ # build\VisualGDB\Debug\esp-idf\wolfssl\x509_crt_bundle_wolfssl
+ #
+ message(STATUS "Confirming cert bundle exists...")
+ if(EXISTS "${crt_bundle}")
+ # Number of spaces is to align path value outputs
+ message(STATUS "Bundle file found for PlatformIO: ${crt_bundle}")
+ else()
+ APPEND_LIBWOLFSSL_CMAKE_OUTPUT("ERROR: Failed to find bundle file found for PlatformIO: ${crt_bundle}")
+ message(STATUS "Check for entry in platformio.ini: board_build.embed_files = certs/x509_crt_bundle_wolfssl ")
+ message(FATAL_ERROR "WOLFSSL_CERTIFICATE_BUNDLE is enabled for PlatformIO, but predefined file not found: ${crt_bundle}")
+ endif()
+ else()
+ # APPEND_LIBWOLFSSL_CMAKE_OUTPUT("Generate bundle: ${GENERATE_CERT_BUNDLEPY} ${args}")
+ # Not PlatformIO
+ # Generate bundle according to config
+ # File is generated at build time, not cmake load
+ add_custom_command(OUTPUT ${crt_bundle}
+ COMMAND ${GENERATE_CERT_BUNDLEPY} ARGS ${args}
+ DEPENDS ${custom_bundle_path}
+ VERBATIM)
+
+ if(EXISTS "${crt_bundle}")
+ message(STATUS "Bundle file exists from prior build: ${crt_bundle}")
+ else()
+ message(STATUS "Bundle file expected during next build: ${crt_bundle}")
+ endif()
+
+ # Reminder the file is generated at build time, not cmake load time.
+ message(STATUS "wolfSSL Cert Bundle File to be created at build time in: ${crt_bundle}")
+ endif()
+
+ add_custom_target(custom_wolfssl_bundle DEPENDS ${crt_bundle})
+
+ # the wolfSSL certificate bundle is baked into wolfSSL
+ add_dependencies(${COMPONENT_LIB} custom_wolfssl_bundle)
+
+ # COMPONENT_LIB may vary: __idf_wolfssl, __idf_esp_wolfssl, etc
+ # target_add_binary_data(__idf_wolfssl ${crt_bundle} BINARY)
+ target_add_binary_data(${COMPONENT_LIB} ${crt_bundle} BINARY)
+ set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+ APPEND PROPERTY ADDITIONAL_CLEAN_FILES
+ "${crt_bundle}")
+ else()
+ if(IS_PLATFORMIO)
+ message(STATUS "WARNING: CONFIG_WOLFSSL_CERTIFICATE_BUNDLE enabled but cannot be generated in PlatformmIO")
+ else()
+ message(STATUS "WARNING: CONFIG_WOLFSSL_CERTIFICATE_BUNDLE enabled but directory not found: ${WOLFSSL_ESP_CRT_BUNDLE_DIR}")
+ endif()
+ message(FATAL_ERROR "not detected")
+ endif()
+endif()
+
+# endfunction() # WOLFSSL_INIT_CERT_BUNDLE
# Some optional diagnostics. Verbose ones are truncated.
if (VERBOSE_COMPONENT_MESSAGES)
@@ -652,6 +1131,12 @@ else()
endif()
# target_sources(wolfssl PRIVATE "\"${WOLFSSL_ROOT}/wolfssl/\"" "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt\"")
+ message(STATUS "DETECTED_PROJECT_NAME=${CMAKE_PROJECT_NAME}")
+ message(STATUS "COMPONENT_TARGET=${COMPONENT_TARGET}")
+ target_compile_definitions(${COMPONENT_TARGET} PRIVATE DETECTED_PROJECT_NAME="${CMAKE_PROJECT_NAME}")
+ if( "${CMAKE_PROJECT_NAME}" STREQUAL "esp_http_client_example" )
+ target_compile_definitions(${COMPONENT_TARGET} PRIVATE APP_ESP_HTTP_CLIENT_EXAMPLE="y")
+ endif()
endif() # CMAKE_BUILD_EARLY_EXPANSION
@@ -669,71 +1154,97 @@ endif()
# end multiple component check
-#
-# LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT)
-#
-# Save the THIS_VAR as a string in a macro called VAR_OUPUT
-#
-# VAR_OUPUT: the name of the macro to define
-# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process()
-# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful.
-#
-function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT )
- # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true.
- string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE)
-
- # if we had a successful operation, save the THIS_VAR in VAR_OUPUT
- if(${IS_VALID_VALUE})
- # strip newline chars in THIS_VAR parameter and save in VAR_VALUE
- string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR})
-
- # we'll could percolate the value to the parent for possible later use
- # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE)
-
- # but we're only using it here in this function
- set(${VAR_OUPUT} ${VAR_VALUE})
-
- # we'll print what we found to the console
- message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}")
-
- # the interesting part is defining the VAR_OUPUT name a value to use in the app
- add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\")
- else()
- # if we get here, check the execute_process command and parameters.
- message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT")
- set(${VAR_OUPUT} "Unknown")
- endif()
-endfunction() # LIBWOLFSSL_SAVE_INFO
+execute_process(
+ COMMAND ${git_cmd} "rev-parse" "--is-inside-work-tree"
+ OUTPUT_VARIABLE IS_GIT_REPO
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_QUIET
+)
# create some programmatic #define values that will be used by ShowExtendedSystemInfo().
# see wolfcrypt\src\port\Espressif\esp32_utl.c
-if(NOT CMAKE_BUILD_EARLY_EXPANSION)
+if(NOT CMAKE_BUILD_EARLY_EXPANSION AND WOLFSSL_ROOT AND (IS_GIT_REPO STREQUAL "true"))
set (git_cmd "git")
message(STATUS "Adding macro definitions:")
# LIBWOLFSSL_VERSION_GIT_ORIGIN: git config --get remote.origin.url
- execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
+ execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url"
+ OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_ORIGIN "${TMP_OUT}" "${TMP_RES}")
# LIBWOLFSSL_VERSION_GIT_BRANCH: git rev-parse --abbrev-ref HEAD
- execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
+ execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD"
+ OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_BRANCH "${TMP_OUT}" "${TMP_RES}")
# LIBWOLFSSL_VERSION_GIT_HASH: git rev-parse HEAD
- execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
+ execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD"
+ OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}")
# LIBWOLFSSL_VERSION_GIT_SHORT_HASH: git rev-parse --short HEAD
- execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
+ execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD"
+ OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}")
# LIBWOLFSSL_VERSION_GIT_HASH_DATE git show --no-patch --no-notes --pretty=\'\%cd\'
- execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES )
+ execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd}
+ "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'"
+ OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES )
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}")
LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_WOLFSSL_ROOT "${WOLFSSL_ROOT}" "${TMP_RES}")
- message(STATUS "************************************************************************************************")
- message(STATUS "wolfssl component config complete!")
- message(STATUS "************************************************************************************************")
endif()
+
+# Ensure flag "-DWOLFSSL_ESPIDF" is already in CMAKE_C_FLAGS if not yet found from project
+string(FIND "${CMAKE_C_FLAGS}" "-DWOLFSSL_ESPIDF" FLAG_ALRREADY_FOUND_WOLFSSL_ESPIDF)
+
+if(FLAG_ALRREADY_FOUND_WOLFSSL_ESPIDF EQUAL -1)
+ # Flag not found, append it
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_ESPIDF")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS")
+endif()
+
+if(WOLFSSL_ROOT)
+ message(STATUS "Using wolfSSL in ${WOLFSSL_ROOT}")
+
+ # PlatformIO does not process script from from the Espressif cmake process.
+ # We need to know where wolfSSL source code was found, so save it in the
+ # PIO_WOLFSSL_ROOT environment variable to later be read by extra_script.py
+
+ set(ENV{PIO_WOLFSSL_ROOT} "${WOLFSSL_ROOT}")
+ message(STATUS "PIO_WOLFSSL_ROOT = $ENV{PIO_WOLFSSL_ROOT}")
+ message(STATUS "PLATFORMIO_BUILD_DIR = $ENV{PLATFORMIO_BUILD_DIR}")
+ # See esp-tls Kconfig; menu "ESP-TLS", ESP_TLS_LIBRARY_CHOOSE
+ if(CONFIG_ESP_TLS_USING_WOLFSSL)
+ if ( ("${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266") OR ("${IDF_TARGET}" STREQUAL "esp8266") )
+ message(STATUS "This version of wolfSSL is not supported on the ESP8266 esp-tls at this time. Check ESP-TLS config")
+ else()
+ message(STATUS "wolfSSL will be used for ESP-TLS")
+ endif()
+ else()
+ message(STATUS "WARNING: wolfSSL NOT selected for ESP-TLS. Features and performance will be limited.")
+ endif()
+else()
+ message(STATUS "")
+ message(STATUS "Consider setting WOLFSSL_ROOT environment variable, use Kconfig setting, or set manually in this cmake file, above.")
+ message(STATUS "")
+ message(STATUS "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message(STATUS "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message(STATUS "ERROR: Could not find wolfSSL Source Code")
+ message(STATUS "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message(STATUS "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+endif()
+
+# A single instance of potentially multiple cmake messages to send to app:
+message(STATUS "LIBWOLFSSL_CMAKE_OUTPUT: ${LIBWOLFSSL_CMAKE_OUTPUT}")
+LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_CMAKE_OUTPUT "${LIBWOLFSSL_CMAKE_OUTPUT}" "0")
+
+file(APPEND "${CMAKE_BINARY_DIR}/libwolfssl_output.h"
+ "\n"
+ "#endif\n" )
+
+message(STATUS "************************************************************************************************")
+message(STATUS "wolfSSL component config complete!")
+message(STATUS "************************************************************************************************")
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/Kconfig b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/Kconfig
new file mode 100644
index 00000000..717f4dc6
--- /dev/null
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/Kconfig
@@ -0,0 +1,552 @@
+# Kconfig template
+#
+# Copyright (C) 2014-2025 wolfSSL Inc.
+#
+# This file is part of wolfSSH.
+#
+# wolfSSH is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# wolfSSH is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with wolfSSH. If not, see .
+#
+
+# Kconfig File Version 5.7.2.001 for esp-idf integration
+
+# Kconfig Format Rules
+#
+# See:
+# https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/kconfig.html
+#
+# Format rules for Kconfig files are as follows:
+#
+# Option names in any menus should have consistent prefixes. The prefix
+# currently should have at least 3 characters.
+#
+# The unit of indentation should be 4 spaces. All sub-items belonging to a
+# parent item are indented by one level deeper. For example, menu is indented
+# by 0 spaces, config menu by 4 spaces, help in config by 8 spaces, and the
+# text under help by 12 spaces.
+#
+# No trailing spaces are allowed at the end of the lines.
+#
+# The maximum length of options is NOT 50 characters as documented.
+# kconfcheck will complain that options should be 40 at most.
+#
+# Fix option lengths first. Superfluous errors on other lines may occur.
+#
+# The maximum length of lines is 120 characters.
+#
+# python -m kconfcheck
+#
+# ---------------------------------------------------------------------------------------------------------------------
+# Begin main wolfSSL configuration menu
+# ---------------------------------------------------------------------------------------------------------------------
+# See ESP-IDF esp-tls component for config TLS_STACK_WOLFSSL
+
+menu "wolfSSL"
+
+ menu "Hardening"
+ config ESP_WOLFSSL_WC_NO_HARDEN
+ bool "Disable wolfSSL hardening"
+ default n
+ help
+ Sets WC_NO_HARDEN
+
+ config ESP_WOLFSSL_TFM_TIMING_RESISTANT
+ bool "Enable TFM Timing Resistant Code"
+ default n
+ help
+ Sets TFM_TIMING_RESISTANT.
+
+ endmenu # Hardening
+
+ config ESP_WOLFSSL_ENABLE_BENCHMARK
+ bool "Enable wolfSSL Benchmark Library"
+ default n
+ help
+ Enables wolfcrypt/benchmark/benchmark.c code for benchmark metrics. Disables NO_CRYPT_BENCHMARK.
+
+
+ menu "Benchmark Debug"
+ config ESP_DEBUG_WOLFSSL_BENCHMARK_TIMING
+ bool "Enable benchmark timing debug"
+ depends on ESP_WOLFSSL_ENABLE_BENCHMARK
+ default n
+ help
+ Enable wolfssl debug for benchmark metric timing (CPU Cycles, RTOS ticks, etc).
+
+ config ESP_WOLFSSL_BENCHMARK_TIMER_DEBUG
+ bool "Enable benchmark timer debug"
+ depends on ESP_WOLFSSL_ENABLE_BENCHMARK
+ default n
+ help
+ Turn on timer debugging (used when CPU cycles not available)
+
+ endmenu # Benchmark Debug
+
+ # -----------------------------------------------------------------------------------------------------------------
+ # wolfCrypt Test
+ # -----------------------------------------------------------------------------------------------------------------
+ config ESP_WOLFSSL_ENABLE_TEST
+ bool "Enable wolfCrypt Test Library"
+ default n
+ help
+ Enables wolfcrypt/test/test.c code for testing. Disables NO_CRYPT_TEST.
+
+ menu "wolfCrypt tests"
+ config WOLFSSL_HAVE_WOLFCRYPT_TEST_OPTIONS
+ bool "Enable wolfCrypt Test Options"
+ depends on ESP_WOLFSSL_ENABLE_TEST
+ default n
+ help
+ Enables HAVE_WOLFCRYPT_TEST_OPTIONS
+
+ config TEST_ESPIDF_ALL_WOLFSSL
+ bool "Enable all features to use in tests"
+ depends on ESP_WOLFSSL_ENABLE_TEST
+ default n
+ help
+ Enables TEST_ESPIDF_ALL_WOLFSSL
+
+ endmenu # wolfCrypt tests
+
+ # -----------------------------------------------------------------------------------------------------------------
+ # Apple HomeKit Options
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "Apple HomeKit"
+ config WOLFSSL_APPLE_HOMEKIT
+ bool "Enable Apple HomeKit options"
+ default n
+ help
+ Enables FP_MAX_BITS (8192 * 2), SRP, ChaCha, Poly1305, Base64 encoding needed for Apple HomeKit.
+ endmenu # Apple HomeKit
+ # -----------------------------------------------------------------------------------------------------------------
+
+ config ESP_WOLFSSL_DISABLE_MY_ECC
+ bool "Disable ECC in my project"
+ default "n"
+ help
+ ECC is enabled by default. Select this option to disable.
+
+ config ESP_WOLFSSL_ENABLE_MY_USE_RSA
+ bool "Enable RSA in my project"
+ default "n"
+ help
+ RSA is disabled by default. Select this option to enable.
+
+ config ESP_WOLFSSL_BENCHMARK
+ bool "Enable wolfSSL Benchmark"
+ default n
+ help
+ Enables user settings relevant to benchmark code
+
+ config ESP_TLS_USING_WOLFSSL_SPECIFIED
+ bool "Use the specified wolfssl for ESP-TLS"
+ default Y
+ help
+ Includes wolfSSL from specified directory (not using esp-wolfssl).
+
+ config ESP_WOLFSSL_NO_USE_FAST_MATH
+ bool "Disable FAST_MATH library and all ESP32 Hardware Acceleration"
+ select ESP_WOLFSSL_NO_HW
+ select ESP_WOLFSSL_NO_HW_AES
+ select ESP_WOLFSSL_NO_HW_HASH
+ select ESP_WOLFSSL_NO_HW_RSA_PRI
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_MP_MUL
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_MULMOD
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_EXPTMOD
+ default n
+ help
+ When disabling all hardware acceleration for smaller memory footprint,
+ disabling TFM fast math provides faster wolfSSL software algorithms in an
+ even smaller flash memory footprint.
+
+ menu "Protocol Config"
+ config WOLFSSL_HAVE_ALPN
+ bool "Enable ALPN (Application Layer Protocol Negotiation) in wolfSSL"
+ default y
+
+ config WOLFSSL_ALLOW_TLS13
+ bool "Allow TLS 1.3"
+ default y
+ help
+ Allow TLS to fallback to TLS1.2. Memory footprint will likely be larger for TLS1.2.
+ When disabled HTTPS and MQTT over TLS connections will fail if TLS1.3 not accepted.
+
+ config WOLFSSL_ALLOW_TLS12
+ bool "Allow TLS 1.2"
+ default n
+ help
+ Allow TLS to fallback to TLS1.2. Memory footprint will likely be larger for TLS1.2.
+ When disabled HTTPS and MQTT over TLS connections will fail if TLS1.3 not accepted.
+
+ config WOLFSSL_HAVE_TLS_EXTENSIONS
+ bool "Enable TLS Extensions"
+ default y
+ help
+ Sets HAVE_TLS_EXTENSIONS which is needed for TLS 1.3, SNI, ALPN, and more.
+
+ config WOLFSSL_ALT_CERT_CHAINS
+ bool "Enable Alternate Certificate Chains"
+ default n
+ help
+ The option relaxes the default strict wolfSSL certificate chain processing. This
+ will typically need to be enabled when loading only a CA file. Typically solves
+ the -188 ASN_NO_SIGNER_E error. Use with caution.
+
+ config WOLFSSL_HAVE_OCSP
+ bool "Enable OCSP (Online Certificate Status Protocol) in wolfSSL"
+ default n
+ help
+ Sets HAVE_OCSP
+
+ endmenu # Protocol Config
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ config TLS_STACK_WOLFSSL
+ # Invisible option that locks TLS_STACK_WOLFSSL to ESP_TLS_USING_WOLFSSL
+ bool
+ default n
+ select FREERTOS_ENABLE_BACKWARD_COMPATIBILITY
+ help
+ Includes wolfSSL in ESP-TLS so that it can be compiled with wolfSSL as its SSL/TLS library.
+ Enabled when wolfSSL is selected in ESP_TLS_LIBRARY_CHOOSE.
+
+ menu "wolfSSL ESP-TLS"
+ depends on ESP_TLS_USING_WOLFSSL
+
+ menu "Certificate Bundle"
+ depends on ESP_TLS_USING_WOLFSSL
+
+ config WOLFSSL_CERTIFICATE_BUNDLE
+ bool "Enable trusted root certificate bundle"
+ default y if ESP_TLS_USING_WOLFSSL
+ default n
+ depends on ESP_TLS_USING_WOLFSSL
+ help
+ Enable support for large number of default root certificates
+
+ When enabled this option allows user to store default as well
+ as customer specific root certificates in compressed format rather
+ than storing full certificate. For the root certificates the public key and the subject name
+ will be stored.
+
+ config WOLFSSL_NO_ASN_STRICT
+ bool "Relax Certificate ASN Strict Checks"
+ default n
+ depends on ESP_TLS_USING_WOLFSSL
+ help
+ Allows sub-optimal certificate ASN checks. Unless using a bundle with known issues,
+ it is recommended to NOT enable this.
+
+ config WOLFSSL_ASN_ALLOW_0_SERIAL
+ bool "Allow cert missing an ASN Serial Number"
+ default y
+ depends on ESP_TLS_USING_WOLFSSL
+ help
+ Although not recommended, there may be certificates in the bundle that are missing
+ a serial number. This option allows the missing value without having to fully
+ disable strict ASN checking with WOLFSSL_NO_ASN_STRICT.
+
+ choice WOLFSSL_DEFAULT_CERTIFICATE_BUNDLE
+ bool "Default certificate bundle options"
+ depends on WOLFSSL_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+ default WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_FULL
+
+ config WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_FULL
+ bool "Use the full default certificate bundle"
+ config WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_CMN
+ bool "Use only the most common certificates from the default bundles"
+ help
+ Use only the most common certificates from the default bundles, reducing the size with 50%,
+ while still having around 99% coverage.
+ config WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_NONE
+ bool "Do not use the default certificate bundle"
+ endchoice
+
+ config WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE
+ depends on WOLFSSL_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+ default n
+ bool "Use alternate certificate bundle"
+ help
+ Typically only used for PlatformIO which cannot generate a certificate bundle at build time.
+ Enable this option to specify a fixed wolfSSL certificate file path and file name.
+
+ config WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE_PATH_AND_NAME
+ depends on WOLFSSL_ALTERNATE_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+ string "Default certificate bundle alternate path and name"
+ default "./certs/x509_crt_bundle_wolfssl"
+ help
+ Name of the default certificate bundle directory. Typically used only with PlatformIO.
+ Reminder PlatformIO cannot generate a bundle from cmake python script call. Relative
+ paths are with respect to root of this project.
+
+ config WOLFSSL_CUSTOM_CERTIFICATE_BUNDLE
+ depends on WOLFSSL_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+ default n
+ bool "Add custom certificates to the default bundle"
+
+ config WOLFSSL_CUSTOM_CERTIFICATE_BUNDLE_PATH
+ depends on WOLFSSL_CUSTOM_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+ string "Custom certificate bundle path"
+ help
+ Name of the custom certificate directory or file. This path is evaluated
+ relative to the project root directory.
+
+ config WOLFSSL_CERTIFICATE_BUNDLE_DEPRECATED_LIST
+ bool "Add deprecated root certificates"
+ depends on WOLFSSL_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL && !WOLFSSL_CERTIFICATE_BUNDLE_DEFAULT_NONE
+ help
+ Include the deprecated list of root certificates in the bundle.
+ This list gets updated when a certificate is removed from the Mozilla's
+ NSS root certificate store. This config can be enabled if you would like
+ to ensure that none of the certificates that were deployed in the product
+ are affected because of the update to bundle. In turn, enabling this
+ config keeps expired, retracted certificates in the bundle and it may
+ pose a security risk.
+
+ - Deprecated cert list may grow based based on sync with upstream bundle
+ - Deprecated certs would be be removed in ESP-IDF (next) major release
+
+ config WOLFSSL_CERTIFICATE_BUNDLE_MAX_CERTS
+ int "Maximum no of certificates allowed in certificate bundle"
+ default 200
+ depends on WOLFSSL_CERTIFICATE_BUNDLE && ESP_TLS_USING_WOLFSSL
+
+ endmenu
+ endmenu # wolfSSL ESP-TLS
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ config ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ bool "Modify default hardware acceleration settings"
+ default n
+ help
+ When disabling all hardware acceleration for smaller memory footprint,
+ disabling TFM fast math provides faster wolfSSL software algorithms in an
+ even smaller flash memory footprint.
+ Typically used for debugging, analysis, or optimizations. The default
+ hardware acceleration features can be each manually adjusted.
+
+ menu "wolfSSL Hardware Acceleration"
+
+ config ESP_WOLFSSL_NO_ESP32_CRYPT
+ bool "Disable all ESP32 Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ select ESP_WOLFSSL_NO_HW_AES
+ select ESP_WOLFSSL_NO_HW_HASH
+ select ESP_WOLFSSL_NO_HW_RSA_PRI
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_MP_MUL
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_MULMOD
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_EXPTMOD
+ help
+ Hardware acceleration enabled by default. When selected defines: NO_ESP32_CRYPT.
+ Consider disabling FASTMATH (other libraries are faster in software and smaller)
+
+ config ESP_WOLFSSL_NO_HW_AES
+ bool "Disable all ESP32 AES Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ help
+ Hardware acceleration enabled by default.When selected defines: NO_HW_AES
+
+ config ESP_WOLFSSL_NO_HW_HASH
+ bool "Disable all ESP32 SHA Hash Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ help
+ Hardware acceleration enabled by default. When selected defines: NO_HW_HASH
+
+ config ESP_WOLFSSL_NO_HW_RSA_PRI
+ bool "Disable all ESP32 RSA Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ select ESP_WOLFSSL_NO_HW_PRI_MP_MUL
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_MULMOD
+ select ESP_WOLFSSL_NO_HW_RSA_PRI_EXPTMOD
+ help
+ Hardware acceleration enabled by default. When selected defines: NO_HW_RSA_PRI
+
+ config ESP_WOLFSSL_NO_HW_RSA_PRI_MP_MUL
+ bool "Disable all ESP32 Multiplication Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ help
+ Hardware acceleration enabled by default. When selected defines: NO_HW_RSA_PRI_MP_MUL
+
+ config ESP_WOLFSSL_NO_HW_RSA_PRI_MULMOD
+ bool "Disable all ESP32 Modular Multiplication Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ help
+ Hardware acceleration enabled by default. When selected defines: NO_HW_RSA_PRI_MULMOD
+
+ config ESP_WOLFSSL_NO_HW_RSA_PRI_EXPTMOD
+ bool "Disable all ESP32 RSA Exponential Math Hardware Acceleration"
+ depends on ESP_WOLFSSL_ALT_HARDWARE_ACCELERATION
+ default n
+ help
+ Hardware acceleration enabled by default.
+ Select this option to force disable: NO_HW_RSA_PRI_EXPTMOD
+
+ config ESP_WOLFSSL_DEBUG_ESP_HW_MULTI_RSAMAX_BITS
+ bool "Enable debugging of RSA Multiplication operand length"
+ default n
+ help
+ Prints an esp log warning to the default console UART when one of the
+ multiplication operands exceeds the maximum size supported by hardware,
+ requiring fallback to software. This can be helpful to pick key sizes
+ when performance is critical. See also metrics for counting instances.
+
+ config ESP_WOLFSSL_DEBUG_ESP_HW_MOD_RSAMAX_BITS
+ bool "Enable debugging of RSA Modular operand length"
+ default n
+ help
+ Prints an esp log warning to the default console UART when one of the
+ modular math operands exceeds the maximum size supported by hardware,
+ requiring fallback to software. This can be helpful to pick key sizes
+ when performance is critical. See also metrics for counting instances.
+
+ endmenu # wolfSSL Hardware Acceleration
+
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "wolfSSL Post Quantum Kyber KEM PQ"
+
+ config ESP_WOLFSSL_ENABLE_MLKEM
+ bool "Enable ML-KEM (Kyber Post Quantum)"
+ default n
+ help
+ bool "Enable wolfSSL ML-KEM"
+
+ config WOLFSSL_ENABLE_KYBER
+ bool "Enable Kyber (Round 3)"
+ default n
+ help
+ Enable old compatibility with Kyber Round 3 (enables experimental settings)
+
+ endmenu # wolfSSL Post Quantum Kyber KEM PQ
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "wolfSSL Debug Options"
+ config ESP_WOLFSSL_DEBUG_WOLFSSL
+ bool "Enable wolfSSL Debugging"
+ default n
+ help
+ Enable debugging messages for wolfSSL. See user_settings.h for additional debug options.
+
+ config ESP_WOLFSSL_NO_STACK_SIZE_BUILD_WARNING
+ bool "Suppress build-time warnings for main stack size"
+ default n
+ help
+ Useful only when wolfSSL is running in main task. See FreeRTOS stack size for custom tasks.
+
+ config ESP_WOLFSSL_TEST_LOOP
+ bool "Run test apps in a loop until failure"
+ default y
+ help
+ Enable a loop wrapper for benchmark, http_client, and wolfssl test apps.
+
+ config ESP_WOLFSSL_EXPERIMENTAL_SETTINGS
+ bool "Enable wolfSSL Experimental Settings"
+ default n
+ help
+ Enables experimental settings for wolfSSL. See documentation.
+ endmenu # wolfSSL Debug Options
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "wolfSSL Customization"
+ config CUSTOM_SETTING_WOLFSSL_ROOT
+ string "Enter a path for wolfSSL source code"
+ default "~/workspace/wolfssl"
+ help
+ This option lets you specify a directory for the wolfSSL source code (typically a git clone).
+ Enter the path using forward slashes (e.g., C:/myfolder/mysubfolder) or double backslashes
+ (e.g., C:\\myfolder\\mysubfolder).
+
+ endmenu # wolfSSL Customization
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "Component Config"
+ config IGNORE_ESP_IDF_WOLFSSL_COMPONENT
+ bool "Ignore the ESP-IDF component of wolfSSL (if present)"
+ default n
+ help
+ Ignores wolfSSL present in the esp-idf/components directory. Requires wolfssl as a local component.
+
+ config IGNORE_LOCAL_WOLFSSL_COMPONENT
+ bool "Ignore the local component of wolfSSL (if present)"
+ default n
+ help
+ Ignores wolfSSL present in the local project components directory.
+ Requires wolfssl as a ESP-IDF component.
+
+ endmenu # Component Config
+ # -----------------------------------------------------------------------------------------------------------------
+
+ # -----------------------------------------------------------------------------------------------------------------
+ menu "Utility Config"
+ config USE_WOLFSSL_ESP_SDK_TIME
+ bool "Enable wolfSSL time helper functions"
+ default n
+ help
+ Enables use of various time and date setting functions found in the esp-sdk-lib.h file.
+
+ config USE_WOLFSSL_ESP_SDK_WIFI
+ bool "Enable wolfSSL WiFi helper functions"
+ default n
+ help
+ Enables use of various time and date setting functions found in the esp-sdk-lib.h file.
+
+ endmenu # Utility Config
+endmenu # wolfSSL
+# ---------------------------------------------------------------------------------------------------------------------
+
+
+# ---------------------------------------------------------------------------------------------------------------------
+menu "wolfSSH"
+ config ESP_ENABLE_WOLFSSH
+ bool "Enable wolfSSH options"
+ default n
+ help
+ Enables WOLFSSH_TERM, WOLFSSL_KEY_GEN, WOLFSSL_PTHREADS, WOLFSSH_TEST_SERVER, WOLFSSH_TEST_THREADING
+
+ config ESP_WOLFSSL_DEBUG_WOLFSSH
+ bool "Enable wolfSSH debugging"
+ default n
+ help
+ Enable wolfSSH debugging macro. See user_settings.h
+
+endmenu # wolfSSH
+# ---------------------------------------------------------------------------------------------------------------------
+
+# ---------------------------------------------------------------------------------------------------------------------
+menu "wolfMQTT"
+ config ESP_ENABLE_WOLFMQTT
+ bool "Enable wolfMQTT options"
+ default n
+ help
+ Enables WOLFMQTT
+
+ config ESP_WOLFSSL_DEBUG_WOLFMQTT
+ bool "Enable wolfMQTT debugging"
+ default n
+ help
+ Enable wolfMQTT debugging macro. See user_settings.h
+
+endmenu # wolfMQTT
+# ---------------------------------------------------------------------------------------------------------------------
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/README.md b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/README.md
index 040c8c0b..d7791241 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/README.md
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/README.md
@@ -1,9 +1,162 @@
-# Component wolfSSL
-
-This `wolfssl` directory exists only for the stand-alone examples.
-
-The only files of interest are the [CMakeLists.txt](./CMakeLists.txt) that should point
-to the wolfSSL source code and the respective [include/user_settings.h](./include/user_settings.h).
-
-This directory is _not_ included in the publish to the Espressif Registry, as that
-mechanism copies the published source code to the local component directory as needed.
+# wolfSSL Espressif Component
+
+This is the directory for wolfSSL as an Espressif ESP-IDF component.
+
+Other options are available, such as installing wolfSSL as a local _project_ component using the [Managed Component](https://www.wolfssl.com/wolfssl-now-available-in-espressif-component-registry/).
+
+Enabling this wolfSSL ESP-IDF component allows other ESP-IDF libraries such as those that depend on [ESP-TLS](https://github.com/espressif/esp-idf/tree/master/components/esp-tls)
+to also use the wolfSSL library. (See [github.com/wolfSSL/wolfssl](https://github.com/wolfSSL/wolfssl))
+
+The wolfSSL source code is not included here. Instead, the `idf.py menuconfig` option can be used to configure the
+`sdkconfig` file setting: `CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT` to point to the desired wolfSSL code.
+
+## Directory Contents
+
+This directory must contain, at a minimum:
+
+- `CMakeLists.txt`
+- `./include/user_settings.h`
+
+The directory should also contain:
+- `Kconfig`
+- `component.mk`
+
+The directory may contain wolfSSL source, for example with a [Managed Component](https://www.wolfssl.com/wolfssl-now-available-in-espressif-component-registry/),
+or if the `setup.sh` script was used from [wolfSSL/IDE/Espressif/ESP-IDF](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF).
+
+
+Under normal circumstances when the wolfSSL source is not included here, the `CMakeLists.txt` will search for it in this order:
+
+- A hard-coded `WOLFSSL_ROOT` cmake variable.
+- `WOLFSSL_ROOT` Environment Variable
+- The `CONFIG_CUSTOM_SETTING_WOLFSSL_ROOT` value in the `sdkconfig` file, from the `Kconfig` option.
+- Any parent directories, up to the root (if this directory is in the ESP-IDF components)
+- Any parent directories, up to the root (if this directory is a project component)
+
+While recursing up the directory tree, the following names of wolfSSL directories will be considered:
+
+- `wolfssl-[current user name]`
+- `wolfssl-master`
+- `wolfssl`
+
+## Getting Started
+
+See the `Espressif Getting Started Guide`.
+
+```
+# Set environment variable to ESP-IDF location
+# For example, VisualGDB in WSL
+WRK_IDF_PATH=/mnt/c/SysGCC/esp32/esp-idf/v5.2
+WRK_IDF_PATH=/mnt/c/SysGCC/esp32-master/esp-idf/v5.3-master
+
+# Or wherever the ESP-IDF is installed:
+WRK_IDF_PATH=~/esp/esp-idf
+
+echo "Run export.sh from ${WRK_IDF_PATH}"
+. ${WRK_IDF_PATH}/export.sh
+
+cd [your project]
+
+idf.py menuconfig
+```
+
+Enable wolfSSL to be used in the ESP-TLS:
+
+```
+Component config --->
+ ESP-TLS --->
+ Choose SSL/TLS library for ESP-TLS (See help for more Info)
+ (X) wolfSSL (License info in wolfSSL directory README)
+```
+
+Adjust wolfSSL settings, such as path to source code as needed:
+
+```
+Component config --->
+ wolfSSL --->
+ [*] Include wolfSSL in ESP-TLS
+ [*] Use the specified wolfssl for ESP-TLS
+ (~/workspace/wolfssl) Enter a path for wolfSSL source code
+```
+
+## Configuration
+
+All settings for wolfSSL are adjusted in the [include/user_settings.h](./include/user_settings.h) file.
+
+The `user_settings.h` file should not be included directly. Instead, `#include `
+before any other wolfSSL headers, like this:
+
+
+```c
+/* ESP-IDF */
+#include
+#include "sdkconfig.h"
+
+/* wolfSSL */
+/* Always include wolfcrypt/settings.h before any other wolfSSL file. */
+/* Reminder: settings.h pulls in user_settings.h; don't include it here. */
+#if defined(WOLFSSL_USER_SETTINGS)
+ #include
+ #if defined(WOLFSSL_ESPIDF)
+ #include
+ #include
+ #include
+ #include
+ #include
+ #else
+ #error "Problem with wolfSSL user_settings. " \
+ "Check components/wolfssl/include " \
+ "and confirm WOLFSSL_USER_SETTINGS is defined, " \
+ "typically in the component CMakeLists.txt"
+ #endif
+#else
+ /* Define WOLFSSL_USER_SETTINGS project wide for settings.h to include */
+ /* wolfSSL user settings in ./components/wolfssl/include/user_settings.h */
+ #error "Missing WOLFSSL_USER_SETTINGS in CMakeLists or Makefile:\
+ CFLAGS +=-DWOLFSSL_USER_SETTINGS"
+#endif
+```
+
+## Examples
+
+See the wolfSSL examples:
+
+- [wolfSSL Core Examples](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples)
+- [wolfSSL Additional Examples](https://github.com/wolfSSL/wolfssl-examples/tree/master/ESP32)
+- [wolfSSH Core Examples](https://github.com/wolfSSL/wolfssh/tree/master/ide/Espressif/ESP-IDF/examples)
+- [wolfSSH Additional Examples](https://github.com/wolfSSL/wolfssh-examples/tree/main/Espressif)
+- [wolfMQTT Examples](https://github.com/wolfSSL/wolfMQTT/tree/master/IDE/Espressif/ESP-IDF/examples)
+
+## Platforms
+
+The ESP-IDF wolfSSL is also available for PlatformIO:
+
+- [Release wolfSSL](https://registry.platformio.org/search?q=owner%3Awolfssl)
+- [Staging / Preview wolfSSL](https://registry.platformio.org/search?q=owner%3Awolfssl-staging)
+
+The wolfSSL library can also be used for Espressif with Arduino:
+
+- [arduino.cc/reference/en/libraries/wolfssl](https://www.arduino.cc/reference/en/libraries/wolfssl/)
+- [github.com/wolfSSL/Arduino-wolfSSL](https://github.com/wolfSSL/Arduino-wolfSSL)
+
+
+## Additional Information
+
+- [wolfSSL Documentation](https://www.wolfssl.com/documentation/manuals/wolfssl/index.html) and [docs/espressif](https://www.wolfssl.com/docs/espressif/)
+- [wolfSSL FAQ](https://www.wolfssl.com/docs/frequently-asked-questions-faq/)
+- [wolfSSL Products](https://www.wolfssl.com/products/)
+- [www.wolfssl.com/espressif](https://www.wolfssl.com/espressif/)
+- [More...](https://www.wolfssl.com/?s=espressif)
+
+## Contact
+
+Have a specific request or questions? We'd love to hear from you! Please contact us at support@wolfssl.com or open an issue on GitHub.
+
+## Licensing and Support
+
+wolfSSL (formerly known as CyaSSL) and wolfCrypt are either licensed for use under the GPLv2 (or at your option any later version) or a standard commercial license. For our users who cannot use wolfSSL under GPLv2 (or any later version), a commercial license to wolfSSL and wolfCrypt is available.
+
+See the LICENSE.txt, visit wolfssl.com/license, contact us at licensing@wolfssl.com or call +1 425 245 8247
+
+View Commercial Support Options: [wolfssl.com/products/support-and-maintenance](wolfssl.com/products/support-and-maintenance)
+
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/component.mk b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/component.mk
new file mode 100644
index 00000000..3ff2a46f
--- /dev/null
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/component.mk
@@ -0,0 +1,305 @@
+#
+# Copyright (C) 2014-2025 wolfSSL Inc.
+#
+# This file is part of wolfSSH.
+#
+# wolfSSH is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# wolfSSH is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with wolfSSH. If not, see .
+#
+
+$(info *********** wolfssl component ************)
+
+#
+# Component Makefile
+#
+#
+# The Espressif Managed Components are only for newer versions of the ESP-IDF
+# Typically only for ESP32[-x] targets and only for ESP-IDF v4.3 or later:
+# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html
+# https://components.espressif.com/
+#
+# Usage:
+#
+# make flash
+#
+# make flash ESPPORT=/dev/ttyS55
+#
+# make flash ESPBAUD=9600
+#
+# make monitor ESPPORT=COM1
+#
+# make monitor ESPPORT=/dev/ttyS55 MONITORBAUD=115200
+#
+# export ESPPORT=/dev/ttyS55
+#
+# https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html
+#
+
+# Although the project should define WOLFSSL_USER_SETTINGS, we'll also
+# define it here:
+CFLAGS +=-DWOLFSSL_USER_SETTINGS
+
+# Note that 4 source files created by autogen are excluded here.
+#
+# See these files commented out, below. Adjust as needed for your application:
+#
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/async.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/selftest.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o
+
+
+# NOTICE: the WOLFSSL_ROOT setting MUST be relative!
+# See https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-guides/build-system.html?highlight=must+relative#optional-component-specific-variables
+# In the wolfSSL GitHub examples for Espressif:
+# https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples
+# When this wolfssl component.mk makefile is in [project]/components/wolfssl
+# The root is 7 directories up from here (the location of of this component.mk):
+#
+WOLFSSL_ROOT ?= ../../../../../../..
+THIS_DIR := $(shell pwd)
+WOLFSSL_ROOT_OBJ := $(THIS_DIR)
+
+# When running make from commandline or VisualGDB, the current path varies:
+ifeq ("$(VISUALGDB_DIR)","")
+ # current path is typically /mnt/c/workspace/wolfssl-gojimmypi/IDE/Espressif/ESP-IDF/examples/wolfssl_test/build/wolfssl
+ $(info VISUALGDB_DIR build not detected. shell: $(shell echo $$SHELL))
+else
+ # current path is typically /C/workspace/wolfssl-gojimmypi/IDE/Espressif/ESP-IDF/examples/wolfssl_test/build/Debug/wolfssl
+ $(info Detected VisualGDB in: $(VISUALGDB_DIR) shell: $(shell echo $$SHELL))
+endif
+
+# To set the location of a different location, it is best to use relative paths.
+#
+# Set WOLFSSL_ROOT to a relative path from the current component directory.
+# For example, if the wolfssl_client is copied from the examples to test:
+#
+# cp -r /IDE/Espressif/ESP-IDF/examples/wolfssl_client/* /mnt/c/test/demo
+#
+# we run make in /mnt/c/test/demo
+# component is in /mnt/c/test/demo/components/wolfssl
+# wolfssl is in /mnt/c/workspace/wolfssl-master
+#
+# "/mnt/c" is 4 directories up:
+# 2 for `./test/demo` from where we run `make`, plus
+# 2 more from the location of `component.mk` located
+# in `[current directory]/components/wolfssl`.
+#
+# Thus we need 4 parent reference to find the relative path to wolfSSL:
+# WOLFSSL_ROOT := ../../../../workspace/wolfssl-master
+
+# Optional CFLAGS (make works without these; for reference only)
+# CFLAGS += -I$(WOLFSSL_ROOT)/wolfssl
+# CFLAGS += -I$(WOLFSSL_ROOT)/wolfssl/wolfcrypt
+# CFLAGS += -I$(WOLFSSL_ROOT)/wolfssl/wolfcrypt/port/Espressif
+
+abs_WOLFSSL_ROOT := $(shell realpath $(WOLFSSL_ROOT))
+
+# print-wolfssl-path-value:
+# @echo "WOLFSSL_ROOT defined: $(WOLFSSL_ROOT)"
+# @echo "WOLFSSL_ROOT actual: $(abs_WOLFSSL_ROOT)"
+
+$(info WOLFSSL_ROOT defined: $(WOLFSSL_ROOT))
+$(info WOLFSSL_ROOT actual: $(abs_WOLFSSL_ROOT))
+$(info THIS_DIR defined: $(THIS_DIR))
+$(info WOLFSSL_ROOT_OBJ defined: $(WOLFSSL_ROOT_OBJ))
+
+# NOTE: The wolfSSL include directory (e.g. user_settings.h) is
+# located HERE in THIS project, and *not* in the wolfSSL root.
+COMPONENT_ADD_INCLUDEDIRS := .
+COMPONENT_ADD_INCLUDEDIRS += include
+COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/.
+COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl
+COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl/wolfcrypt
+COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl/wolfcrypt/port/Espressif
+
+# COMPONENT_ADD_INCLUDEDIRS += $ENV(IDF_PATH)/components/freertos/include/freertos
+# COMPONENT_ADD_INCLUDEDIRS += "$ENV(IDF_PATH)/soc/esp32s3/include/soc"
+
+# wolfSSL
+COMPONENT_SRCDIRS := $(WOLFSSL_ROOT)/src
+
+# wolfcrypt
+COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src
+
+# Espressif
+COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif
+COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/atmel
+
+COMPONENT_OBJEXCLUDE := $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/aes_asm.o
+COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/evp.o
+COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/misc.o
+COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/sha512_asm.o
+COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/fe_x25519_asm.o
+COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT_OBJ)/wolfcrypt/src/aes_gcm_x86_asm.o
+
+##
+## wolfSSL
+##
+## reminder object files may end up in `./build` or `build/debug` or `build/release`, depending on build environment & settings.
+##
+# COMPONENT_OBJS := $(WOLFSSL_ROOT)/src/bio.o # part of ssl.c, omitted to avoid "does not need to be compiled separately"
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/conf.o # part of ssl.c
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/crl.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/dtls.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/dtls13.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/internal.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/keys.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/ocsp.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/pk.o # part of ssl.c
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/quic.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/sniffer.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/ssl.o
+# COMPONENT_OBJS += src/ssl_asn1.o
+# COMPONENT_OBJS += src/ssl_bn.o
+# COMPONENT_OBJS += src/ssl_certman.o
+# COMPONENT_OBJS += src/ssl_crypto.o
+# COMPONENT_OBJS += src/ssl_misc.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/tls.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/tls13.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/wolfio.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/x509.o # part of ssl.c
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/x509_str.o # part of ssl.c
+
+##
+## wolfcrypt
+##
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/aes.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/arc4.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/asm.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/asn.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/async.o # autogen exclusion
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/blake2b.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/blake2s.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/camellia.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/chacha.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/chacha20_poly1305.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cmac.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/coding.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/compress.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cpuid.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cryptocb.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/curve25519.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/curve448.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/des3.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dh.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dilithium.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dsa.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ecc.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/eccsi.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ecc_fp.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed25519.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed448.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/error.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_mlkem.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_lms.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_xmss.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/falcon.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_448.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_low_mem.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_operations.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fips.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fips_test.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_448.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_low_mem.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_operations.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hash.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hmac.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hpke.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/integer.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/kdf.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/logging.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md2.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md4.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md5.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/memory.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/misc.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pkcs12.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pkcs7.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/poly1305.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pwdbased.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/random.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/rc2.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ripemd.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/rsa.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sakke.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/selftest.o # autogen exclusion
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha256.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha3.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha512.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/signature.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/siphash.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm2.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm3.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm4.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sphincs.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm32.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm64.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_armthumb.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c32.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c64.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_cortexm.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_dsp32.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_int.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_arm32.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_arm64.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_armthumb.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_c32.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_c64.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_cortexm.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_x86_64.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_x86_64.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/srp.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/tfm.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_dsp.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_encrypt.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_mlkem.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_mlkem_poly.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_lms.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_pkcs11.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_port.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_xmss.o
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o # autogen exclusion
+# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o # autogen exclusion
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfevent.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfmath.o
+
+##
+## Espressif
+##
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_aes.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_mp.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_sha.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_util.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_time_lib.o
+COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.o
+
+##
+## wolfcrypt benchmark (optional)
+##
+## COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark/benchmark.o
+## COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark
+## COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark
+
+
+##
+## wolfcrypt test (optional)
+##
+## COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/test/test.o
+## COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/test
+## COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfcrypt/test/include
+
+$(info ********** end wolfssl component **********)
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/include/user_settings.h b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/include/user_settings.h
index 6d0e197e..0affd142 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/include/user_settings.h
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/components/wolfssl/include/user_settings.h
@@ -1,6 +1,6 @@
-/* user_settings.h
+/* wolfssl-component include/user_settings.h
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
@@ -17,20 +17,61 @@
* You should have received a copy of the GNU General Public License
* along with wolfSSH. If not, see .
*/
+#define WOLFSSL_ESPIDF_COMPONENT_VERSION 0x01
-#include /* essential to chip set detection */
+/* Examples such as test and benchmark are known to cause watchdog timeouts.
+ * Note this is often set in project Makefile:
+ * CFLAGS += -DWOLFSSL_ESP_NO_WATCHDOG=1 */
+#define WOLFSSL_ESP_NO_WATCHDOG 1
-#undef WOLFSSL_ESPIDF
-#undef WOLFSSL_ESP32
-#undef WOLFSSL_ESPWROOM32SE
-#undef WOLFSSL_ESP32
-#undef WOLFSSL_ESP8266
+/* The Espressif project config file. See also sdkconfig.defaults */
+#include "sdkconfig.h"
-#define WOLFSSL_ESPIDF
+/* This user_settings.h is for Espressif ESP-IDF
+ *
+ * Standardized wolfSSL Espressif ESP32 + ESP8266 user_settings.h V5.7.0-1
+ *
+ * Do not include any wolfssl headers here.
+ *
+ * When editing this file:
+ * ensure all examples match. The template example is the reference.
+ */
+
+/* Naming convention: (see also esp32-crypt.h for the reference source).
+ *
+ * CONFIG_
+ * This prefix indicates the setting came from the sdkconfig / Kconfig.
+ *
+ * May or may not be related to wolfSSL.
+ *
+ * The name after this prefix must exactly match that in the Kconfig file.
+ *
+ * WOLFSSL_
+ * Typical of many, but not all wolfSSL macro names.
+ *
+ * Applies to all wolfSSL products such as wolfSSH, wolfMQTT, etc.
+ *
+ * May or may not have a corresponding sdkconfig / Kconfig control.
+ *
+ * ESP_WOLFSSL_
+ * These are NOT valid wolfSSL macro names. These are names only used in
+ * the ESP-IDF Kconfig files. When parsed, they will have a "CONFIG_"
+ * suffix added. See next section.
+ *
+ * CONFIG_ESP_WOLFSSL_
+ * This is a wolfSSL-specific macro that has been defined in the ESP-IDF
+ * via the sdkconfig / menuconfig. Any text after this prefix should
+ * exactly match an existing wolfSSL macro name.
+ *
+ * Applies to all wolfSSL products such as wolfSSH, wolfMQTT, etc.
+ *
+ * These macros may also be specific to only the project or environment,
+ * and possibly not used anywhere else in the wolfSSL libraries.
+ */
/* The Espressif sdkconfig will have chipset info.
**
-** Possible values:
+** Some possible values:
**
** CONFIG_IDF_TARGET_ESP32
** CONFIG_IDF_TARGET_ESP32S2
@@ -39,17 +80,251 @@
** CONFIG_IDF_TARGET_ESP32C6
*/
+#undef WOLFSSL_ESPIDF
+#define WOLFSSL_ESPIDF
+
+/* Test various user_settings between applications by selecting example apps
+ * in `idf.py menuconfig` for Example wolfSSL Configuration settings: */
+
+/* Turn on messages that are useful to see only in examples. */
+#define WOLFSSL_EXAMPLE_VERBOSITY
+
+/* Paths can be long, ensure the entire value printed during debug */
+#define WOLFSSL_MAX_ERROR_SZ 500
+
+/* wolfSSL Examples: set macros used in example applications.
+ *
+ * These Settings NOT available in ESP-IDF (e.g. esp-tls)
+ *
+ * Any settings needed by ESP-IDF components should be explicitly set,
+ * and not by these example-specific settings via CONFIG_WOLFSSL_EXAMPLE_n
+ *
+ * ESP-IDF settings should be Kconfig "CONFIG_[name]" values when possible. */
+#if defined(CONFIG_WOLFSSL_EXAMPLE_NAME_TEMPLATE)
+ /* See https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/template */
+ /* We don't use WiFi, so don't compile in the esp-sdk-lib WiFi helpers: */
+ /* #define USE_WOLFSSL_ESP_SDK_WIFI */
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_TEST)
+ /* See https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/wolfssl_test */
+ /* We don't use WiFi, so don't compile in the esp-sdk-lib WiFi helpers: */
+ /* #define USE_WOLFSSL_ESP_SDK_WIFI */
+ #define TEST_ESPIDF_ALL_WOLFSSL
+ #define HAVE_HKDF
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_BENCHMARK)
+ /* See https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark */
+ /* We don't use WiFi, so don't compile in the esp-sdk-lib WiFi helpers: */
+ /* #define USE_WOLFSSL_ESP_SDK_WIFI */
+ #define WOLFSSL_BENCHMARK_FIXED_UNITS_KB
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_TLS_CLIENT)
+ /* See https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/wolfssl_client */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_TLS_SERVER)
+ /* See https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/wolfssl_server */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+
+/* wolfSSH Examples */
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_WOLFSSH_TEMPLATE)
+ /* See https://github.com/wolfSSL/wolfssh/tree/master/ide/Espressif/ESP-IDF/examples/wolfssh_template */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_WOLFSSH_ECHOSERVER)
+ /* See https://github.com/wolfSSL/wolfssh/tree/master/ide/Espressif/ESP-IDF/examples/wolfssh_echoserver */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_ESP32_SSH_SERVER)
+ /* See https://github.com/wolfSSL/wolfssh-examples/tree/main/Espressif/ESP32/ESP32-SSH-Server */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_ESP8266_SSH_SERVER)
+ /* See https://github.com/wolfSSL/wolfssh-examples/tree/main/Espressif/ESP8266/ESP8266-SSH-Server */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+
+/* wolfMQTT Examples */
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_WOLFMQTT_TEMPLATE)
+ /* See https://github.com/wolfSSL/wolfMQTT/tree/master/IDE/Espressif/ESP-IDF/examples/wolfmqtt_template */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_WOLFMQTT_AWS_IOT_MQTT)
+ /* See https://github.com/wolfSSL/wolfMQTT/tree/master/IDE/Espressif/ESP-IDF/examples/AWS_IoT_MQTT */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+
+/* wolfTPM Examples */
+#elif defined(CONFIG_WOLFTPM_EXAMPLE_NAME_ESPRESSIF)
+ /* See https://github.com/wolfSSL/wolfTPM/tree/master/IDE/Espressif */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+
+/* Apple HomeKit Examples */
+#elif defined(CONFIG_WOLFSSL_APPLE_HOMEKIT)
+ /* See https://github.com/AchimPieters/esp32-homekit-demo */
+
+/* no example selected */
+#elif defined(CONFIG_WOLFSSL_EXAMPLE_NAME_NONE)
+ /* We'll assume the app needs to use wolfSSL sdk lib function */
+ #define USE_WOLFSSL_ESP_SDK_WIFI
+
+/* Other applications detected by cmake */
+#elif defined(APP_ESP_HTTP_CLIENT_EXAMPLE)
+ /* The wolfSSL Version of the client example */
+ #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C2)
+ /* Less memory available, so smaller key sizes: */
+ #define FP_MAX_BITS (4096 * 2)
+ #else
+ #define FP_MAX_BITS (8192 * 2)
+ #endif
+ #define HAVE_ALPN
+ #define HAVE_SNI
+ #define OPENSSL_EXTRA_X509_SMALL
+ #define HAVE_TLS_EXTENSIONS
+ #define HAVE_SUPPORTED_CURVES
+ #define OPENSSL_EXTRA
+ #ifndef WOLFSSL_ALWAYS_VERIFY_CB
+ #define WOLFSSL_ALWAYS_VERIFY_CB
+ #endif
+ #ifndef WOLFSSL_VERIFY_CB_ALL_CERTS
+ #define WOLFSSL_VERIFY_CB_ALL_CERTS
+ #endif
+ #ifndef KEEP_PEER_CERT
+ #define KEEP_PEER_CERT
+ #endif
+
+#elif defined(APP_ESP_HTTP_CLIENT)
+ /* The ESP-IDF Version */
+ #define FP_MAX_BITS (8192 * 2)
+ #define HAVE_ALPN
+ #define HAVE_SNI
+ #define OPENSSL_EXTRA_X509_SMALL
+ #define HAVE_TLS_EXTENSIONS
+ #define HAVE_SUPPORTED_CURVES
+ #define OPENSSL_EXTRA
+ #ifndef WOLFSSL_ALWAYS_VERIFY_CB
+ #define WOLFSSL_ALWAYS_VERIFY_CB
+ #endif
+ #ifndef WOLFSSL_VERIFY_CB_ALL_CERTS
+ #define WOLFSSL_VERIFY_CB_ALL_CERTS
+ #endif
+ #ifndef KEEP_PEER_CERT
+ #define KEEP_PEER_CERT
+ #endif
+#else
+ #ifdef WOLFSSL_ESPIDF
+ /* #warning "App config undetected" */
+ #endif
+ /* the code is older or does not have application name defined. */
+#endif /* Example wolfSSL Configuration app settings */
+
+/* Optional MLKEM (Kyber Post Quantum) */
+/* ./configure --enable-mlkem */
+/* See Kconfig / menuconfig ESP_WOLFSSL_ENABLE_MLKEM */
+#ifdef CONFIG_ESP_WOLFSSL_ENABLE_MLKEM
+ /* Kyber typically needs a minimum 10K stack */
+ #define WOLFSSL_HAVE_MLKEM
+ #define WOLFSSL_WC_MLKEM
+ #define WOLFSSL_SHAKE128
+ #define WOLFSSL_SHAKE256
+
+ /* Old code points to keep compatibility with Kyber Round 3. */
+ /* ./configure --enable-kyber=all --enable-experimental */
+ #if defined(CONFIG_WOLFSSL_ENABLE_KYBER)
+ #define WOLFSSL_MLKEM_KYBER
+ #define WOLFSSL_EXPERIMENTAL_SETTINGS
+ #endif
+
+ #if defined(CONFIG_IDF_TARGET_ESP8266)
+ /* With limited RAM, we'll disable some of the Kyber sizes: */
+ #define WOLFSSL_NO_KYBER1024
+ #define WOLFSSL_NO_KYBER768
+ #define WOLFSSL_NO_ML_KEM_1024
+ #define WOLFSSL_NO_ML_KEM_768
+ #define NO_SESSION_CACHE
+ #else
+ /* Only needed for older wolfssl versions, see mlkem.h */
+ #define WOLFSSL_KYBER1024
+ /* optional alternative sizes: */
+ /* #define WOLFSSL_KYBER768 */
+ /* #define WOLFSSL_KYBER512 */
+ /* -- or disable a specific one: */
+ /* #define WOLFSSL_NO_ML_KEM_1024 */
+ /* #define WOLFSSL_NO_ML_KEM_768 */
+ /* #define WOLFSSL_NO_ML_KEM_512 */
+ #endif
+#endif
+
+/* Enable AES for all examples */
+#ifdef NO_AES
+ #warning "Found NO_AES, wolfSSL AES Cannot be enabled. Check config."
+#else
+ #define WOLFSSL_AES
+ #define WOLFSSL_AES_COUNTER
+
+ /* Typically only needed for wolfssl_test, see docs. */
+ #define WOLFSSL_AES_DIRECT
+#endif
+
+/* Pick a cert buffer size: */
+/* #define USE_CERT_BUFFERS_2048 */
+/* #define USE_CERT_BUFFERS_1024 */
+#define USE_CERT_BUFFERS_2048
+
+/* The Espressif sdkconfig will have chipset info.
+**
+** Some possible values:
+**
+** CONFIG_IDF_TARGET_ESP32
+** CONFIG_IDF_TARGET_ESP32S2
+** CONFIG_IDF_TARGET_ESP32S3
+** CONFIG_IDF_TARGET_ESP32C3
+** CONFIG_IDF_TARGET_ESP32C6
+*/
+
+/* Optionally enable Apple HomeKit from compiler directive or Kconfig setting */
+#if defined(WOLFSSL_APPLE_HOMEKIT) || defined(CONFIG_WOLFSSL_APPLE_HOMEKIT)
+ /* SRP is known to need 8K; slow on some devices */
+ #define FP_MAX_BITS (8192 * 2)
+ #define WOLFCRYPT_HAVE_SRP
+ #define HAVE_CHACHA
+ #define HAVE_POLY1305
+ #define WOLFSSL_BASE64_ENCODE
+ #endif /* Apple HomeKit settings */
+
+/* Used by ESP-IDF components: */
+#if defined(CONFIG_ESP_TLS_USING_WOLFSSL)
+ /* The ESP-TLS */
+ #ifndef FP_MAX_BITS
+ #if defined(CONFIG_IDF_TARGET_ESP32C2) || \
+ defined(CONFIG_IDF_TARGET_ESP8684) || \
+ defined(CONFIG_IDF_TARGET_ESP8266)
+ /* Optionally set smaller size here */
+ #define FP_MAX_BITS MIN_FFDHE_FP_MAX_BITS
+ #else
+ #define FP_MAX_BITS (4096 * 2)
+ #endif
+ #endif
+ #define HAVE_ALPN
+ #ifndef CONFIG_IDF_TARGET_ESP8266
+ /* Unless installed in the ESP8266 RTOS SDK locally, the wolfSSL
+ * API for SNI will not be seen in the components/esp-tls layer.
+ * Only enable SNI for non-ESP8266 targets by default: */
+ #define HAVE_SNI
+ #endif
+ #define OPENSSL_EXTRA_X509_SMALL
+
+ #define HAVE_TLS_EXTENSIONS
+ #define HAVE_SUPPORTED_CURVES
+#endif
+
/* Optionally enable some wolfSSH settings */
-#ifdef ESP_ENABLE_WOLFSSH
- /* The default SSH Windows size is massive for an embedded target. Limit it: */
+#if defined(ESP_ENABLE_WOLFSSH) || defined(CONFIG_ESP_ENABLE_WOLFSSH)
+ /* Enable wolfSSH. Espressif examples need a few more settings, below */
+ #undef WOLFSSL_WOLFSSH
+ #define WOLFSSL_WOLFSSH
+
+ /* The default SSH Windows size is massive for an embedded target.
+ * Limit it: */
#define DEFAULT_WINDOW_SZ 2000
/* These may be defined in cmake for other examples: */
#undef WOLFSSH_TERM
#define WOLFSSH_TERM
- #undef DEBUG_WOLFSSH
- #define DEBUG_WOLFSSH
+ /* optional debug */
+ /* #undef DEBUG_WOLFSSH */
+ /* #define DEBUG_WOLFSSH */
#undef WOLFSSL_KEY_GEN
#define WOLFSSL_KEY_GEN
@@ -59,21 +334,54 @@
#define WOLFSSH_TEST_SERVER
#define WOLFSSH_TEST_THREADING
-
#endif /* ESP_ENABLE_WOLFSSH */
-/* when you want to use SINGLE THREAD */
-/* #define SINGLE_THREADED */
+
+/* Not yet using WiFi lib, so don't compile in the esp-sdk-lib WiFi helpers: */
+/* #define USE_WOLFSSL_ESP_SDK_WIFI */
/*
- * choose ONE of these Espressif chips to define:
+ * ONE of these Espressif chip families will be detected from sdkconfig:
*
* WOLFSSL_ESP32
* WOLFSSL_ESPWROOM32SE
* WOLFSSL_ESP8266
+ *
+ * following ifdef detection only for syntax highlighting:
*/
+#ifdef WOLFSSL_ESPWROOM32SE
+ #undef WOLFSSL_ESPWROOM32SE
+#endif
+#ifdef WOLFSSL_ESP8266
+ #undef WOLFSSL_ESP8266
+#endif
+#ifdef WOLFSSL_ESP32
+ #undef WOLFSSL_ESP32
+#endif
+/* See below for chipset detection from sdkconfig.h */
-#define WOLFSSL_ESP32
+/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */
+#define SINGLE_THREADED
+
+/* Small session cache saves a lot of RAM for ClientCache and SessionCache.
+ * Memory requirement is about 5KB, otherwise 20K is needed when not specified.
+ * If extra small footprint is needed, try MICRO_SESSION_CACHE (< 1K)
+ * When really desperate or no TLS used, try NO_SESSION_CACHE. */
+#define NO_SESSION_CACHE
+
+/* Small Stack uses more heap. */
+#define WOLFSSL_SMALL_STACK
+
+/* Full debugging turned off, but show malloc failure detail */
+/* #define DEBUG_WOLFSSL */
+#define DEBUG_WOLFSSL_MALLOC
+
+/* See test.c that sets cert buffers; we'll set them here: */
+#define USE_CERT_BUFFERS_256
+#define USE_CERT_BUFFERS_2048
+
+/* RSA_LOW_MEM: Half as much memory but twice as slow. */
+#define RSA_LOW_MEM
/* optionally turn off SHA512/224 SHA512/256 */
/* #define WOLFSSL_NOSHA512_224 */
@@ -87,37 +395,84 @@
/* #define NO_OLD_TLS */
#define BENCH_EMBEDDED
-#define USE_CERT_BUFFERS_2048
-#define NO_OLD_TLS
-/* TLS 1.3
- #define WOLFSSL_TLS13
- #define HAVE_TLS_EXTENSIONS
- #define WC_RSA_PSS
- #define HAVE_SUPPORTED_CURVES
-*/
+/* TLS 1.3 */
+#ifdef CONFIG_WOLFSSL_ALLOW_TLS13
+ #define WOLFSSL_TLS13
+ #define HAVE_TLS_EXTENSIONS
+ #define HAVE_HKDF
-#define HAVE_HKDF
-#define HAVE_AEAD
+ /* May be required */
+ #ifndef HAVE_AEAD
+ #endif
+
+ /* Required for ECC */
+ #define HAVE_SUPPORTED_CURVES
+
+ /* Required for RSA */
+ #define WC_RSA_PSS
+
+ /* TLS 1.3 normally requires HAVE_FFDHE */
+ #if defined(HAVE_FFDHE_2048) || \
+ defined(HAVE_FFDHE_3072) || \
+ defined(HAVE_FFDHE_4096) || \
+ defined(HAVE_FFDHE_6144) || \
+ defined(HAVE_FFDHE_8192)
+ #else
+ #define HAVE_FFDHE_2048
+ /* #error "TLS 1.3 requires HAVE_FFDHE_[nnnn]" */
+ #endif
+#endif
+
+#if defined(CONFIG_IDF_TARGET_ESP32C2) || \
+ defined(CONFIG_IDF_TARGET_ESP8684)
+ /* Optionally set smaller size here */
+ #ifdef HAVE_FFDHE_4096
+ /* this size may be problematic on the C2 */
+ #endif
+ #define HAVE_FFDHE_2048
+#else
+ #define HAVE_FFDHE_4096
+#endif
#define NO_FILESYSTEM
+#define NO_OLD_TLS
+
#define HAVE_AESGCM
-#define WOLFSSL_RIPEMD
-/* when you want to use SHA224 */
-/* #define WOLFSSL_SHA224 */
+/* Optional RIPEMD: RACE Integrity Primitives Evaluation Message Digest */
+/* #define WOLFSSL_RIPEMD */
+/* when you want to use SHA224 */
+#define WOLFSSL_SHA224
/* when you want to use SHA384 */
-/* #define WOLFSSL_SHA384 */
+#define WOLFSSL_SHA384
-/* #define WOLFSSL_SHA3 */
+/* Some features not enabled for ESP8266: */
+#if defined(CONFIG_IDF_TARGET_ESP8266) || \
+ defined(CONFIG_IDF_TARGET_ESP32C2)
+ /* Some known low-memory devices have features not enabled by default. */
+ /* TODO determine low memory configuration for ECC. */
+#else
+ /* when you want to use SHA512 */
+ #define WOLFSSL_SHA512
-#define WOLFSSL_SHA512
+ /* when you want to use SHA3 */
+ /* #define WOLFSSL_SHA3 */
-#define MY_USE_ECC 1
-#define MY_USE_RSA 0
+ /* ED25519 requires SHA512 */
+ #define HAVE_ED25519
+#endif
+
+#if defined(CONFIG_IDF_TARGET_ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C2)
+ #define MY_USE_ECC 0
+ #define MY_USE_RSA 1
+#else
+ #define MY_USE_ECC 1
+ #define MY_USE_RSA 0
+#endif
/* We can use either or both ECC and RSA, but must use at least one. */
#if MY_USE_ECC || MY_USE_RSA
@@ -126,7 +481,7 @@
#define HAVE_ECC
#define HAVE_CURVE25519
#define HAVE_ED25519
-
+ #define WOLFSSL_SHA512
/*
#define HAVE_ECC384
#define CURVE25519_SMALL
@@ -151,24 +506,42 @@
#error "Either RSA or ECC must be enabled"
#endif
+/* Optional OpenSSL compatibility */
+/* #define OPENSSL_EXTRA */
-/* when you want to use pkcs7 */
+/* #Optional HAVE_PKCS7 */
/* #define HAVE_PKCS7 */
#if defined(HAVE_PKCS7)
+ /* HAVE_PKCS7 may enable HAVE_PBKDF2 see settings.h */
+ #define NO_PBKDF2
+
#define HAVE_AES_KEYWRAP
#define HAVE_X963_KDF
#define WOLFSSL_AES_DIRECT
#endif
-/* when you want to use aes counter mode */
+/* when you want to use AES counter mode */
/* #define WOLFSSL_AES_DIRECT */
/* #define WOLFSSL_AES_COUNTER */
-/* debug options */
-/* #define DEBUG_WOLFSSL */
-/* #define WOLFSSL_ESP32_CRYPT_DEBUG */
-/* #define WOLFSSL_ATECC508A_DEBUG */
+/* esp32-wroom-32se specific definition */
+#if defined(WOLFSSL_ESPWROOM32SE)
+ #define WOLFSSL_ATECC508A
+ #define HAVE_PK_CALLBACKS
+ /* when you want to use a custom slot allocation for ATECC608A */
+ /* unless your configuration is unusual, you can use default */
+ /* implementation. */
+ /* #define CUSTOM_SLOT_ALLOCATION */
+#endif
+
+/* WC_NO_CACHE_RESISTANT: slower but more secure */
+/* #define WC_NO_CACHE_RESISTANT */
+
+/* TFM_TIMING_RESISTANT: slower but more secure */
+/* #define TFM_TIMING_RESISTANT */
+
+/* #define WOLFSSL_ATECC508A_DEBUG */
/* date/time */
/* if it cannot adjust time in the device, */
@@ -176,15 +549,21 @@
/* #define NO_ASN_TIME */
/* #define XTIME time */
-/* adjust wait-timeout count if you see timeout in RSA HW acceleration */
-#define ESP_RSA_TIMEOUT_CNT 0x249F00
+/* Adjust wait-timeout count if you see timeout in RSA HW acceleration.
+ * Set to very large number and enable WOLFSSL_HW_METRICS to determine max. */
+#ifndef ESP_RSA_TIMEOUT_CNT
+ #define ESP_RSA_TIMEOUT_CNT 0xFF0000
+#endif
+
+/* hash limit for test.c */
+#define HASH_SIZE_LIMIT
/* USE_FAST_MATH is default */
#define USE_FAST_MATH
/***** Use SP_MATH *****/
-/* #undef USE_FAST_MATH */
+/* #undef USE_FAST_MATH */
/* #define SP_MATH */
/* #define WOLFSSL_SP_MATH_ALL */
/* #define WOLFSSL_SP_RISCV32 */
@@ -193,11 +572,63 @@
/* #undef USE_FAST_MATH */
/* #define USE_INTEGER_HEAP_MATH */
+/* Just syntax highlighting to check math libraries: */
+#if defined(SP_MATH) || \
+ defined(USE_INTEGER_HEAP_MATH) || \
+ defined(USE_INTEGER_HEAP_MATH) || \
+ defined(USE_FAST_MATH) || \
+ defined(WOLFSSL_SP_MATH_ALL) || \
+ defined(WOLFSSL_SP_RISCV32)
+#endif
-#define WOLFSSL_SMALL_STACK
-/* The ESP32 has some detailed statup information available:*/
#define HAVE_VERSION_EXTENDED_INFO
+/* #define HAVE_WC_INTROSPECTION */
+
+#ifndef NO_SESSION_CACHE
+ #define HAVE_SESSION_TICKET
+#endif
+
+/* #define HAVE_HASHDRBG */
+
+#if 0
+/* Example for additional cert functions */
+#define WOLFSSL_KEY_GEN
+ #define WOLFSSL_CERT_REQ
+ #define WOLFSSL_CERT_GEN
+ #define WOLFSSL_CERT_EXT
+ #define WOLFSSL_SYS_CA_CERTS
+
+
+ #define WOLFSSL_CERT_TEXT
+
+ /* command-line options
+ --enable-keygen
+ --enable-certgen
+ --enable-certreq
+ --enable-certext
+ --enable-asn-template
+ */
+
+#endif
+
+#define WOLFSSL_ASN_TEMPLATE
+
+/*
+#undef WOLFSSL_KEY_GEN
+#undef WOLFSSL_CERT_REQ
+#undef WOLFSSL_CERT_GEN
+#undef WOLFSSL_CERT_EXT
+#undef WOLFSSL_SYS_CA_CERTS
+*/
+
+/* command-line options
+--enable-keygen
+--enable-certgen
+--enable-certreq
+--enable-certext
+--enable-asn-template
+*/
/* optional SM4 Ciphers. See https://github.com/wolfSSL/wolfsm */
/*
@@ -251,20 +682,14 @@
#define USE_CERT_BUFFERS_2048
#endif
-/* esp32-wroom-32se specific definition */
-#if defined(WOLFSSL_ESPWROOM32SE)
- #define WOLFSSL_ATECC508A
- #define HAVE_PK_CALLBACKS
- /* when you want to use a custom slot allocation for ATECC608A */
- /* unless your configuration is unusual, you can use default */
- /* implementation. */
- /* #define CUSTOM_SLOT_ALLOCATION */
-#endif
-
-/* Default is HW enabled unless turned off.
-** Uncomment these lines to force SW instead of HW acceleration */
-
+/* Chipset detection from sdkconfig.h
+ * Default is HW enabled unless turned off.
+ * Uncomment lines to force SW instead of HW acceleration */
#if defined(CONFIG_IDF_TARGET_ESP32) || defined(WOLFSSL_ESPWROOM32SE)
+ #define WOLFSSL_ESP32
+ /* Alternatively, if there's an ECC Secure Element present: */
+ /* #define WOLFSSL_ESPWROOM32SE */
+
/* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */
/* #define NO_ESP32_CRYPT */
/* #define NO_WOLFSSL_ESP32_CRYPT_HASH */
@@ -275,23 +700,14 @@
/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */
/* These are defined automatically in esp32-crypt.h, here for clarity: */
- /* no SHA224 HW on ESP32 */
- #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224
+ #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 /* no SHA224 HW on ESP32 */
- /* Define USE_FAST_MATH and SMALL_STACK */
- #define ESP32_USE_RSA_PRIMITIVE
-
- /* threshold for performance adjustment for HW primitive use */
- /* X bits of G^X mod P greater than */
- #define EPS_RSA_EXPT_XBTIS 32
-
- /* X and Y of X * Y mod P greater than */
#undef ESP_RSA_MULM_BITS
- #define ESP_RSA_MULM_BITS 16
-
+ #define ESP_RSA_MULM_BITS 16 /* TODO add compile-time warning */
/***** END CONFIG_IDF_TARGET_ESP32 *****/
#elif defined(CONFIG_IDF_TARGET_ESP32S2)
+ #define WOLFSSL_ESP32
/* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */
/* #define NO_ESP32_CRYPT */
/* #define NO_WOLFSSL_ESP32_CRYPT_HASH */
@@ -304,6 +720,7 @@
/***** END CONFIG_IDF_TARGET_ESP32S2 *****/
#elif defined(CONFIG_IDF_TARGET_ESP32S3)
+ #define WOLFSSL_ESP32
/* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */
/* #define NO_ESP32_CRYPT */
/* #define NO_WOLFSSL_ESP32_CRYPT_HASH */
@@ -317,6 +734,7 @@
#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \
defined(CONFIG_IDF_TARGET_ESP8684)
+ #define WOLFSSL_ESP32
/* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a
* single QFN 4x4 mm package. Out of released documentation, Technical
* Reference Manual as well as ESP-IDF Programming Guide is applicable
@@ -342,6 +760,7 @@
/***** END CONFIG_IDF_TARGET_ESP32C2 *****/
#elif defined(CONFIG_IDF_TARGET_ESP32C3)
+ #define WOLFSSL_ESP32
/* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */
/* #define NO_ESP32_CRYPT */
@@ -359,6 +778,7 @@
/***** END CONFIG_IDF_TARGET_ESP32C3 *****/
#elif defined(CONFIG_IDF_TARGET_ESP32C6)
+ #define WOLFSSL_ESP32
/* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */
/* #define NO_ESP32_CRYPT */
@@ -375,6 +795,7 @@
/***** END CONFIG_IDF_TARGET_ESP32C6 *****/
#elif defined(CONFIG_IDF_TARGET_ESP32H2)
+ #define WOLFSSL_ESP32
/* wolfSSL Hardware Acceleration not yet implemented */
#define NO_ESP32_CRYPT
#define NO_WOLFSSL_ESP32_CRYPT_HASH
@@ -382,12 +803,29 @@
#define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI
/***** END CONFIG_IDF_TARGET_ESP32H2 *****/
-#elif defined(CONFIG_IDF_TARGET_ESP8266)
- /* TODO: Revisit ESP8266 */
+#elif defined(CONFIG_IDF_TARGET_ESP32P4)
+ #define WOLFSSL_ESP32
+ /* wolfSSL Hardware Acceleration not yet implemented */
#define NO_ESP32_CRYPT
#define NO_WOLFSSL_ESP32_CRYPT_HASH
#define NO_WOLFSSL_ESP32_CRYPT_AES
#define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI
+ /***** END CONFIG_IDF_TARGET_ESP32P4 *****/
+
+#elif defined(CONFIG_IDF_TARGET_ESP8266)
+ #define WOLFSSL_ESP8266
+
+ /* There's no hardware encryption on the ESP8266 */
+ /* Consider using the ESP32-C2/C3/C6 */
+ #define NO_ESP32_CRYPT
+ #define NO_WOLFSSL_ESP32_CRYPT_HASH
+ #define NO_WOLFSSL_ESP32_CRYPT_AES
+ #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI
+ #ifndef FP_MAX_BITS
+ /* FP_MAX_BITS matters in wolfssl_test, not just TLS setting. */
+ /* MIN_FFDHE_FP_MAX_BITS = (MIN_FFDHE_BITS * 2); see settings.h */
+ #define FP_MAX_BITS MIN_FFDHE_FP_MAX_BITS
+ #endif
/***** END CONFIG_IDF_TARGET_ESP266 *****/
#elif defined(CONFIG_IDF_TARGET_ESP8684)
@@ -399,33 +837,91 @@
/***** END CONFIG_IDF_TARGET_ESP8684 *****/
#else
- /* Anything else encountered, disable HW accleration */
+ /* Anything else encountered, disable HW acceleration */
+ #warning "Unexpected CONFIG_IDF_TARGET_NN value"
#define NO_ESP32_CRYPT
#define NO_WOLFSSL_ESP32_CRYPT_HASH
#define NO_WOLFSSL_ESP32_CRYPT_AES
#define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI
#endif /* CONFIG_IDF_TARGET Check */
+/* RSA primitive specific definition, listed AFTER the Chipset detection */
+#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE)
+ /* Consider USE_FAST_MATH and SMALL_STACK */
+
+ #ifndef NO_RSA
+ #define ESP32_USE_RSA_PRIMITIVE
+
+ #ifdef CONFIG_ESP_MAIN_TASK_STACK_SIZE
+ /* See idf.py menuconfig for stack warning settings */
+ #if !defined(CONFIG_ESP_WOLFSSL_NO_STACK_SIZE_BUILD_WARNING)
+ #if CONFIG_ESP_MAIN_TASK_STACK_SIZE < 10500
+ #warning "RSA may be difficult with less than 10KB Stack"
+ #endif
+ #else
+ /* Implement your own stack warning here */
+ #endif
+ #endif
+
+ #if defined(CONFIG_IDF_TARGET_ESP32)
+ /* NOTE HW unreliable for small values! */
+ /* threshold for performance adjustment for HW primitive use */
+ /* X bits of G^X mod P greater than */
+ #undef ESP_RSA_EXPT_XBITS
+ #define ESP_RSA_EXPT_XBITS 32
+
+ /* X and Y of X * Y mod P greater than */
+ #undef ESP_RSA_MULM_BITS
+ #define ESP_RSA_MULM_BITS 16
+ #endif
+ #endif
+#endif
+
/* Debug options:
+See wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h for details on debug options
+
+optionally increase error message size for very long paths.
+#define WOLFSSL_MAX_ERROR_SZ 500
+
+Turn wolfSSL debugging on/off:
+ wolfSSL_Debugging_ON();
+ wolfSSL_Debugging_OFF();
#define ESP_VERIFY_MEMBLOCK
#define DEBUG_WOLFSSL
#define DEBUG_WOLFSSL_VERBOSE
#define DEBUG_WOLFSSL_SHA_MUTEX
+#define WOLFSSL_DEBUG_IGNORE_ASN_TIME
+#define WOLFSSL_DEBUG_CERT_BUNDLE
+#define WOLFSSL_DEBUG_CERT_BUNDLE_NAME
#define WOLFSSL_ESP32_CRYPT_DEBUG
#define WOLFSSL_ESP32_CRYPT_HASH_SHA224_DEBUG
#define NO_RECOVER_SOFTWARE_CALC
#define WOLFSSL_TEST_STRAY 1
#define USE_ESP_DPORT_ACCESS_READ_BUFFER
#define WOLFSSL_ESP32_HW_LOCK_DEBUG
+#define WOLFSSL_DEBUG_MUTEX
#define WOLFSSL_DEBUG_ESP_RSA_MULM_BITS
+#define WOLFSSL_DEBUG_ESP_HW_MOD_RSAMAX_BITS
+#define WOLFSSL_DEBUG_ESP_HW_MULTI_RSAMAX_BITS
#define ESP_DISABLE_HW_TASK_LOCK
+#define ESP_MONITOR_HW_TASK_LOCK
+#define USE_ESP_DPORT_ACCESS_READ_BUFFER
+
+See wolfcrypt/benchmark/benchmark.c for debug and other settings:
+
+Turn on benchmark timing debugging (CPU Cycles, RTOS ticks, etc)
+#define DEBUG_WOLFSSL_BENCHMARK_TIMING
+
+Turn on timer debugging (used when CPU cycles not available)
+#define WOLFSSL_BENCHMARK_TIMER_DEBUG
*/
/* Pause in a loop rather than exit. */
-#define WOLFSSL_ESPIDF_ERROR_PAUSE
+/* #define WOLFSSL_ESPIDF_ERROR_PAUSE */
+/* #define WOLFSSL_ESP32_HW_LOCK_DEBUG */
-/* #define WOLFSSL_HW_METRICS */
+#define WOLFSSL_HW_METRICS
/* for test.c */
/* #define HASH_SIZE_LIMIT */
@@ -453,8 +949,9 @@
** [Z = X * Y mod M] in esp_mp_mulmod() */
/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */
-#define WOLFSSL_PUBLIC_MP /* used by benchmark */
-#define USE_CERT_BUFFERS_2048
+
+/* used by benchmark: */
+#define WOLFSSL_PUBLIC_MP
/* when turning on ECC508 / ECC608 support
#define WOLFSSL_ESPWROOM32SE
@@ -463,12 +960,83 @@
#define ATCA_WOLFSSL
*/
-/* optional SM4 Ciphers. See https://github.com/wolfSSL/wolfsm
+/* optional SM4 Ciphers. See github.com/wolfSSL/wolfsm */
+
+/***************************** Certificate Macros *****************************
+ *
+ * The section below defines macros used in typically all of the wolfSSL
+ * examples such as the client and server for certs stored in header files.
+ *
+ * There are various certificate examples in this header file:
+ * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h
+ *
+ * To use the sample certificates in code (not recommended for production!):
+ *
+ * #if defined(USE_CERT_BUFFERS_2048) || defined(USE_CERT_BUFFERS_1024)
+ * #include
+ * #endif
+ *
+ * To use the sets of macros below, define *one* of these:
+ *
+ * USE_CERT_BUFFERS_1024 - ECC 1024 bit encoded ASN1
+ * USE_CERT_BUFFERS_2048 - RSA 2048 bit encoded ASN1
+ * WOLFSSL_SM[2,3,4] - SM Ciphers
+ *
+ * For example: define USE_CERT_BUFFERS_2048 to use CA Certs used in this
+ * wolfSSL function for the `ca_cert_der_2048` buffer, size and types:
+ *
+ * ret = wolfSSL_CTX_load_verify_buffer(ctx,
+ * CTX_CA_CERT,
+ * CTX_CA_CERT_SIZE,
+ * CTX_CA_CERT_TYPE);
+ *
+ * See https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_load_verify_buffer
+ *
+ * In this case the CTX_CA_CERT will be defined as `ca_cert_der_2048` as
+ * defined here: https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h
+ *
+ * The CTX_CA_CERT_SIZE and CTX_CA_CERT_TYPE are similarly used to reference
+ * array size and cert type respectively.
+ *
+ * Similarly for loading the private client key:
+ *
+ * ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx,
+ * CTX_CLIENT_KEY,
+ * CTX_CLIENT_KEY_SIZE,
+ * CTX_CLIENT_KEY_TYPE);
+ *
+ * see https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_use_privatekey_buffer
+ *
+ * Similarly, the other macros are for server certificates and keys:
+ * `CTX_SERVER_CERT` and `CTX_SERVER_KEY` are available.
+ *
+ * The certificate and key names are typically `static const unsigned char`
+ * arrays. The [NAME]_size are typically `sizeof([array name])`, and the types
+ * are the known wolfSSL encoding type integers (e.g. WOLFSSL_FILETYPE_PEM).
+ *
+ * See `SSL_FILETYPE_[name]` in
+ * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/ssl.h
+ *
+ * See Abstract Syntax Notation One (ASN.1) in:
+ * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/asn.h
+ *
+ * Optional SM4 Ciphers:
+ *
+ * Although the SM ciphers are shown here, the `certs_test_sm.h` may not yet
+ * be available. See:
+ * https://github.com/wolfSSL/wolfssl/pull/6825
+ * https://github.com/wolfSSL/wolfsm
+ *
+ * Uncomment these 3 macros to enable the SM Ciphers and use the macros below.
+ */
+
+/*
#define WOLFSSL_SM2
#define WOLFSSL_SM3
#define WOLFSSL_SM4
*/
+/* Conditional macros used in wolfSSL TLS client and server examples */
#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4)
#include
#define CTX_CA_CERT root_sm2
@@ -484,19 +1052,97 @@
#undef WOLFSSL_BASE16
#define WOLFSSL_BASE16
#else
- #define USE_CERT_BUFFERS_2048
- #define USE_CERT_BUFFERS_256
- #define CTX_CA_CERT ca_cert_der_2048
- #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048
- #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1
- #define CTX_SERVER_CERT server_cert_der_2048
- #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048
- #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1
- #define CTX_SERVER_KEY server_key_der_2048
- #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048
- #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1
-#endif
+ #if defined(USE_CERT_BUFFERS_2048)
+ #ifdef USE_CERT_BUFFERS_1024
+ #error "USE_CERT_BUFFERS_1024 is already defined. Pick one."
+ #endif
+ /* Be sure to include in app when using example certs: */
+ #if 0
+ /* Disabled here; see echoserver.c */
+ #include
+ /* or */
+ #include
+ #endif
+
+ #define USE_CERT_BUFFERS_256
+ #define CTX_CA_CERT ca_cert_der_2048
+ #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048
+ #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+
+ #define CTX_SERVER_CERT server_cert_der_2048
+ #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048
+ #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+ #define CTX_SERVER_KEY server_key_der_2048
+ #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048
+ #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1
+
+ #define CTX_CLIENT_CERT client_cert_der_2048
+ #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048
+ #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+ #define CTX_CLIENT_KEY client_key_der_2048
+ #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048
+ #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1
+
+ #elif defined(USE_CERT_BUFFERS_1024)
+ #ifdef USE_CERT_BUFFERS_2048
+ #error "USE_CERT_BUFFERS_2048 is already defined. Pick one."
+ #endif
+
+ /* Be sure to include in app when using example certs: */
+ #if 0
+ /* Disabled here; see echoserver.c */
+ #include
+ /* or */
+ #include
+ #endif
+
+ #define USE_CERT_BUFFERS_256
+ #define CTX_CA_CERT ca_cert_der_1024
+ #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_1024
+ #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+
+ #define CTX_CLIENT_CERT client_cert_der_1024
+ #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_1024
+ #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+ #define CTX_CLIENT_KEY client_key_der_1024
+ #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_1024
+ #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1
+
+ #define CTX_SERVER_CERT server_cert_der_1024
+ #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_1024
+ #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1
+ #define CTX_SERVER_KEY server_key_der_1024
+ #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_1024
+ #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1
+ #else
+ /* Optionally define custom cert arrays, sizes, and types here */
+ #error "Must define USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_1024"
+ #endif
+#endif /* Conditional key and cert constant names */
+
+/******************************************************************************
+** Sanity Checks
+******************************************************************************/
+#if defined(CONFIG_ESP_MAIN_TASK_STACK_SIZE)
+ #if defined(WOLFCRYPT_HAVE_SRP)
+ #if defined(FP_MAX_BITS)
+ #if FP_MAX_BITS < (8192 * 2)
+ #define ESP_SRP_MINIMUM_STACK_8K (24 * 1024)
+ #else
+ #define ESP_SRP_MINIMUM_STACK_8K (28 * 1024)
+ #endif
+ #else
+ #error "Please define FP_MAX_BITS when using WOLFCRYPT_HAVE_SRP."
+ #endif
+
+ #if (CONFIG_ESP_MAIN_TASK_STACK_SIZE < ESP_SRP_MINIMUM_STACK)
+ #warning "WOLFCRYPT_HAVE_SRP enabled with small stack size"
+ #endif
+ #endif
+#else
+ #warning "CONFIG_ESP_MAIN_TASK_STACK_SIZE not defined!"
+#endif
/* See settings.h for some of the possible hardening options:
*
* #define NO_ESPIDF_DEFAULT
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/CMakeLists.txt b/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/CMakeLists.txt
index 0021fd7e..376a28bf 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/CMakeLists.txt
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/CMakeLists.txt
@@ -1,6 +1,6 @@
# [wolfSSL Project]/main/CMakeLists.txt
#
-# Copyright (C) 2014-2024 wolfSSL Inc.
+# Copyright (C) 2014-2025 wolfSSL Inc.
#
# This file is part of wolfSSH.
#
@@ -28,28 +28,26 @@ message(STATUS "main cmake found WOLFSSL_COMPONENT_NAME = ${WOLFSSL_COMPONENT_NA
if(WIN32)
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS")
- message("Detected Windows")
+ message(STATUS "Detected Windows")
endif()
if(CMAKE_HOST_UNIX)
- message("Detected UNIX")
-endif()
-if(APPLE)
- message("Detected APPLE")
+ message(STATUS "Detected UNIX")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop")
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL")
- message("Detected WSL")
+ message(STATUS "Detected WSL")
endif()
if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32))
# Windows-specific configuration here
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX")
- message("Detected Linux")
+ message(STATUS "Detected Linux")
endif()
if(APPLE)
- # Windows-specific configuration here
+ # Apple-specific configuration here
+ message(STATUS "Detected APPLE")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE")
- message("Detected Apple")
+ message(STATUS "Detected Apple")
endif()
set (git_cmd "git")
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/include/main.h b/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/include/main.h
index 73d22769..8a66a193 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/include/main.h
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/include/main.h
@@ -1,6 +1,6 @@
/* template main.h
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
diff --git a/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/main.c b/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/main.c
index af6f87cc..de0cb440 100644
--- a/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/main.c
+++ b/ide/Espressif/ESP-IDF/examples/wolfssh_template/main/main.c
@@ -1,6 +1,6 @@
/* main.c
*
- * Copyright (C) 2014-2024 wolfSSL Inc.
+ * Copyright (C) 2014-2025 wolfSSL Inc.
*
* This file is part of wolfSSH.
*
@@ -38,7 +38,7 @@ void app_main(void)
wolfSSH_Debugging_ON();
#else
ESP_LOGI(TAG, "DEBUG_WOLFSSH is not defined, "
- "so nothing will happen for teh next statement");
+ "so nothing will happen for the next statement");
#endif
#ifdef HAVE_VERSION_EXTENDED_INFO