Skip to content

Commit 470c02f

Browse files
committed
Merge branch 'feature/wolfssl_tls13' into 'master'
wolfSSL: Support for TLS 1.3 See merge request esp-components/esp-wolfssl!16
2 parents 30e5300 + 28c2fcd commit 470c02f

File tree

12 files changed

+296
-229
lines changed

12 files changed

+296
-229
lines changed

.gitignore

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# gtags
2+
GTAGS
3+
GRTAGS
4+
GPATH
5+
6+
# emacs
7+
.dir-locals.el
8+
9+
# emacs temp file suffixes
10+
*~
11+
.#*
12+
\#*#
13+
14+
# eclipse setting
15+
.settings
16+
17+
# MacOS directory files
18+
.DS_Store
19+
20+
# Components Unit Test Apps files
21+
components/**/build
22+
components/**/sdkconfig
23+
components/**/sdkconfig.old
24+
25+
# Example project files
26+
examples/**/sdkconfig
27+
examples/**/sdkconfig.old
28+
examples/**/build
29+
30+
# VS Code Settings
31+
.vscode/
32+
33+
# VIM files
34+
*.swp
35+
*.swo
36+
37+
# Clion IDE CMake build & config
38+
.idea/
39+
cmake-build-*/
40+
41+
# ESP-IDF default build directory name
42+
build

.gitlab-ci.yml

Lines changed: 16 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ variables:
66
BATCH_BUILD: "1"
77
V: "0"
88
MAKEFLAGS: "-j5 --no-keep-going"
9+
GIT_SUBMODULE_STRATEGY: recursive
910

1011
# before each job, we need to check if this job is filtered by bot stage/job filter
1112
.apply_bot_filter: &apply_bot_filter
@@ -25,65 +26,36 @@ variables:
2526
- git --version
2627
- git submodule update --init --recursive
2728

28-
test_build_esp32:
29-
when: always
29+
.build_idf_template:
3030
stage: build
31-
image: "$CI_DOCKER_REGISTRY/esp-idf-doc-env:v4.4-1-v2"
31+
image: espressif/idf:latest
3232
tags:
3333
- build
3434
variables:
35-
IDF_PATH: "$CI_PROJECT_DIR/idf/esp-idf"
36-
before_script: *setup_env
35+
PEDANTIC_FLAGS: "-Werror -Werror=unused-variable -Werror=unused-but-set-variable -Werror=unused-function"
36+
EXTRA_CFLAGS: "${PEDANTIC_FLAGS}"
37+
EXTRA_CXXFLAGS: "${PEDANTIC_FLAGS}"
3738
script:
38-
- export PATH="$IDF_PATH/tools:$PATH"
39-
- mkdir idf
40-
- cd idf
41-
- export
42-
- git clone --recursive --depth 1 $GITLAB_SSH_SERVER/idf/esp-idf.git
43-
- pushd esp-idf
44-
- echo "v4.1" > version.txt
45-
- source tools/ci/setup_python.sh
46-
- source tools/ci/configure_ci_environment.sh
47-
- tools/idf_tools.py --non-interactive install && eval "$(tools/idf_tools.py --non-interactive export)" || exit 1
48-
- popd
49-
- cd ../tools/ci && ./build_exmaples.sh || exit 1
39+
- cd $CI_PROJECT_DIR/tools/ci
40+
- ./build_examples.sh || exit 1
5041

51-
test_build_esp8266:
52-
when: always
53-
stage: build
54-
image: $CI_DOCKER_REGISTRY/esp8266-ci-env-new
55-
tags:
56-
- build
57-
variables:
58-
IDF_PATH: "$CI_PROJECT_DIR/idf/ESP8266_RTOS_SDK"
59-
before_script: *setup_env
60-
script:
61-
- export PATH="$IDF_PATH/tools:$PATH"
62-
- mkdir idf
63-
- cd idf
64-
- export
65-
- git clone --recursive --depth 1 $GITLAB_SSH_SERVER/sdk/ESP8266_RTOS_SDK.git
66-
- pushd ESP8266_RTOS_SDK
67-
- echo "v3.3" > version.txt
68-
- tools/idf_tools.py --non-interactive install && eval "$(tools/idf_tools.py --non-interactive export)" || exit 1
69-
- source tools/ci/configure_ci_environment.sh
70-
- popd
71-
- cd ../tools/ci && ./build_exmaples.sh || exit 1
42+
build_idf_master:
43+
extends: .build_idf_template
44+
image: espressif/idf:latest
7245

46+
build_idf_v4.4:
47+
extends: .build_idf_template
48+
image: espressif/idf:release-v4.4
7349

7450
push_master_to_github:
7551
stage: deploy
76-
image: "$CI_DOCKER_REGISTRY/esp-idf-doc-env:v4.4-1-v2"
52+
image: espressif/idf:latest
7753
tags:
7854
- deploy
7955
only:
8056
- master
81-
- /^release\/v/
82-
- /^v\d+\.\d+(\.\d+)?($|-)/
8357
when: on_success
84-
dependencies:
85-
- test_build_esp32
86-
- test_build_esp8266
58+
dependencies: []
8759
variables:
8860
GITHUB_PUSH_REFS: refs/remotes/origin/release refs/remotes/origin/master
8961
before_script: *setup_env

CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,7 @@ idf_component_register(SRC_DIRS "${COMPONENT_SRCDIRS}"
3131
EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE_1}"
3232
)
3333
target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-cpp -Wno-maybe-uninitialized)
34-
set_source_files_properties(wolfssl/src/ssl.c PROPERTIES COMPILE_FLAGS -Wno-format-truncation)
34+
set_source_files_properties(wolfssl/src/ssl.c PROPERTIES COMPILE_FLAGS "-Wno-format-truncation -Wno-char-subscripts")
35+
set_source_files_properties(wolfssl/wolfcrypt/src/random.c PROPERTIES COMPILE_FLAGS "-Wno-implicit-function-declaration")
36+
set_source_files_properties(wolfssl/wolfcrypt/src/port/Espressif/esp32_aes.c PROPERTIES COMPILE_FLAGS "-Wno-incompatible-pointer-types")
3537
target_compile_definitions(${COMPONENT_LIB} PUBLIC WOLFSSL_USER_SETTINGS)

Kconfig

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
menu "wolfSSL"
22

33
config TLS_STACK_WOLFSSL
4-
bool "Include wolfSSL in esp-tls"
4+
bool "Include wolfSSL in ESP-TLS"
55
default y
6+
select FREERTOS_ENABLE_BACKWARD_COMPATIBILITY
67
help
7-
Includes wolfSSL in the esp-tls so that , esp-tls can be compiled with wolfSSL as its SSL/TLS library.
8+
Includes wolfSSL in ESP-TLS so that it can be compiled with wolfSSL as its SSL/TLS library.
89

910
config WOLFSSL_HAVE_ALPN
10-
bool "Enable ALPN(Application Layer Protocol Negotiation) in wolfSSL"
11+
bool "Enable ALPN (Application Layer Protocol Negotiation) in wolfSSL"
1112
default y
12-
help
13-
Enables ALPN option in wolfSSL.
1413

1514
endmenu # wolfSSL

examples/https_request/main/https_request_example_main.c

Lines changed: 56 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,21 @@
4343
#include "esp_tls.h"
4444

4545
/* Constants that aren't configurable in menuconfig */
46-
#define WEB_SERVER "www.howsmyssl.com"
47-
#define WEB_PORT "443"
48-
#define WEB_URL "https://www.howsmyssl.com/a/check"
46+
#define WEB_SERVER "api.github.com"
47+
#define WEB_PORT (443)
48+
#define WEB_URL "https://api.github.com/zen"
4949

5050
static const char *TAG = "example";
5151

5252
static const char *REQUEST = "GET " WEB_URL " HTTP/1.0\r\n"
53-
"Host: "WEB_SERVER"\r\n"
54-
"User-Agent: esp-idf/1.0 esp32\r\n"
55-
"\r\n";
53+
"Host: "WEB_SERVER"\r\n"
54+
"User-Agent: esp-idf/1.0 esp32\r\n"
55+
"\r\n";
5656

57-
/* Root cert for howsmyssl.com, taken from server_root_cert.pem
57+
/* Root cert for api.github.com, taken from server_root_cert.pem
5858
5959
The PEM file was extracted from the output of this command:
60-
openssl s_client -showcerts -connect www.howsmyssl.com:443 </dev/null
60+
openssl s_client -showcerts -connect www.api.github.com:443 </dev/null
6161
6262
The CA root cert is the last cert given in the chain of certs.
6363
@@ -67,80 +67,97 @@ static const char *REQUEST = "GET " WEB_URL " HTTP/1.0\r\n"
6767
extern const uint8_t server_root_cert_pem_start[] asm("_binary_server_root_cert_pem_start");
6868
extern const uint8_t server_root_cert_pem_end[] asm("_binary_server_root_cert_pem_end");
6969

70+
/*
71+
* NOTE: To turn on debug logs for wolfSSL component and this example, uncomment
72+
* #define DEBUF_WOLFSSL in file components/wolfssl/port/user_settings.h
73+
*/
74+
/*
75+
* NOTE: To turn on TLS 1.3 only mode for wolfSSL component, uncomment
76+
* #define WOLFSSL_TLS13 in file ../components/wolfssl/port/user_settings.h
77+
*/
7078

7179
static void https_get_task(void *pvParameters)
7280
{
7381
char buf[512];
7482
int ret, len;
83+
esp_tls_t *tls = NULL;
7584

76-
while(1) {
85+
while (1) {
7786
esp_tls_cfg_t cfg = {
7887
.cacert_buf = server_root_cert_pem_start,
7988
.cacert_bytes = server_root_cert_pem_end - server_root_cert_pem_start,
8089
};
81-
82-
struct esp_tls *tls = esp_tls_conn_http_new(WEB_URL, &cfg);
83-
84-
if(tls != NULL) {
90+
91+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
92+
tls = esp_tls_init();
93+
if (!tls) {
94+
ESP_LOGE(TAG, "Failed to allocate esp_tls handle!");
95+
goto exit;
96+
}
97+
98+
if (esp_tls_conn_http_new_sync(WEB_URL, &cfg, tls) == 1) {
99+
ESP_LOGI(TAG, "Connection established...");
100+
} else {
101+
ESP_LOGE(TAG, "Connection failed...");
102+
goto cleanup;
103+
}
104+
#else // ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
105+
tls = esp_tls_conn_http_new(WEB_URL, &cfg);
106+
if (tls != NULL) {
85107
ESP_LOGI(TAG, "Connection established...");
86108
} else {
87109
ESP_LOGE(TAG, "Connection failed...");
88110
goto exit;
89111
}
90-
112+
#endif //ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
113+
91114
size_t written_bytes = 0;
92115
do {
93-
ret = esp_tls_conn_write(tls,
94-
REQUEST + written_bytes,
116+
ret = esp_tls_conn_write(tls,
117+
REQUEST + written_bytes,
95118
strlen(REQUEST) - written_bytes);
96119
if (ret >= 0) {
97120
ESP_LOGI(TAG, "%d bytes written", ret);
98121
written_bytes += ret;
99122
} else if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) {
100123
ESP_LOGE(TAG, "esp_tls_conn_write returned 0x%x", ret);
101-
goto exit;
124+
goto cleanup;
102125
}
103-
} while(written_bytes < strlen(REQUEST));
126+
} while (written_bytes < strlen(REQUEST));
104127

105128
ESP_LOGI(TAG, "Reading HTTP response...");
106129

107-
do
108-
{
130+
do {
109131
len = sizeof(buf) - 1;
110-
bzero(buf, sizeof(buf));
132+
memset(buf, 0x00, sizeof(buf));
133+
111134
ret = esp_tls_conn_read(tls, (char *)buf, len);
112-
113-
if(ret == ESP_TLS_ERR_SSL_WANT_WRITE || ret == ESP_TLS_ERR_SSL_WANT_READ)
135+
if (ret == ESP_TLS_ERR_SSL_WANT_WRITE || ret == ESP_TLS_ERR_SSL_WANT_READ) {
114136
continue;
115-
116-
if(ret < 0)
117-
{
137+
} else if (ret < 0) {
118138
ESP_LOGE(TAG, "esp_tls_conn_read returned -0x%x", -ret);
119139
break;
120-
}
121-
122-
if(ret == 0)
123-
{
140+
} else if (ret == 0) {
124141
ESP_LOGI(TAG, "connection closed");
125142
break;
126143
}
127144

128145
len = ret;
129146
ESP_LOGD(TAG, "%d bytes read", len);
130147
/* Print response directly to stdout as it is read */
131-
for(int i = 0; i < len; i++) {
148+
for (int i = 0; i < len; i++) {
132149
putchar(buf[i]);
133150
}
134-
} while(1);
135-
136-
exit:
137-
esp_tls_conn_delete(tls);
138-
putchar('\n'); // JSON output doesn't have a newline at end
151+
putchar('\n'); // JSON output doesn't have a newline at end
152+
} while (1);
139153

140-
static int request_count;
154+
cleanup:
155+
esp_tls_conn_destroy(tls);
156+
exit:;
157+
static int request_count = 0;
141158
ESP_LOGI(TAG, "Completed %d requests", ++request_count);
142159

143-
for(int countdown = 10; countdown >= 0; countdown--) {
160+
for (int countdown = 10; countdown >= 0; countdown--) {
144161
ESP_LOGI(TAG, "%d...", countdown);
145162
vTaskDelay(1000 / portTICK_PERIOD_MS);
146163
}
@@ -150,7 +167,7 @@ static void https_get_task(void *pvParameters)
150167

151168
void app_main(void)
152169
{
153-
ESP_ERROR_CHECK( nvs_flash_init() );
170+
ESP_ERROR_CHECK(nvs_flash_init());
154171
ESP_ERROR_CHECK(esp_netif_init());
155172
ESP_ERROR_CHECK(esp_event_loop_create_default());
156173

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
-----BEGIN CERTIFICATE-----
2-
MIIEZTCCA02gAwIBAgIQQAF1BIMUpMghjISpDBbN3zANBgkqhkiG9w0BAQsFADA/
3-
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
4-
DkRTVCBSb290IENBIFgzMB4XDTIwMTAwNzE5MjE0MFoXDTIxMDkyOTE5MjE0MFow
5-
MjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxCzAJBgNVBAMT
6-
AlIzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuwIVKMz2oJTTDxLs
7-
jVWSw/iC8ZmmekKIp10mqrUrucVMsa+Oa/l1yKPXD0eUFFU1V4yeqKI5GfWCPEKp
8-
Tm71O8Mu243AsFzzWTjn7c9p8FoLG77AlCQlh/o3cbMT5xys4Zvv2+Q7RVJFlqnB
9-
U840yFLuta7tj95gcOKlVKu2bQ6XpUA0ayvTvGbrZjR8+muLj1cpmfgwF126cm/7
10-
gcWt0oZYPRfH5wm78Sv3htzB2nFd1EbjzK0lwYi8YGd1ZrPxGPeiXOZT/zqItkel
11-
/xMY6pgJdz+dU/nPAeX1pnAXFK9jpP+Zs5Od3FOnBv5IhR2haa4ldbsTzFID9e1R
12-
oYvbFQIDAQABo4IBaDCCAWQwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8E
13-
BAMCAYYwSwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5p
14-
ZGVudHJ1c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTE
15-
p7Gkeyxx+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEE
16-
AYLfEwEBATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2Vu
17-
Y3J5cHQub3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0
18-
LmNvbS9EU1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYf
19-
r52LFMLGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0B
20-
AQsFAAOCAQEA2UzgyfWEiDcx27sT4rP8i2tiEmxYt0l+PAK3qB8oYevO4C5z70kH
21-
ejWEHx2taPDY/laBL21/WKZuNTYQHHPD5b1tXgHXbnL7KqC401dk5VvCadTQsvd8
22-
S8MXjohyc9z9/G2948kLjmE6Flh9dDYrVYA9x2O+hEPGOaEOa1eePynBgPayvUfL
23-
qjBstzLhWVQLGAkXXmNs+5ZnPBxzDJOLxhF2JIbeQAcH5H0tZrUlo5ZYyOqA7s9p
24-
O5b85o3AM/OJ+CktFBQtfvBhcJVd9wvlwPsk+uyOy2HI7mNxKKgsBTt375teA2Tw
25-
UdHkhVNcsAKX1H7GNNLOEADksd86wuoXvg==
2+
MIIEFzCCAv+gAwIBAgIQB/LzXIeod6967+lHmTUlvTANBgkqhkiG9w0BAQwFADBh
3+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
4+
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
5+
QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaMFYxCzAJBgNVBAYTAlVT
6+
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMDAuBgNVBAMTJ0RpZ2lDZXJ0IFRMUyBI
7+
eWJyaWQgRUNDIFNIQTM4NCAyMDIwIENBMTB2MBAGByqGSM49AgEGBSuBBAAiA2IA
8+
BMEbxppbmNmkKaDp1AS12+umsmxVwP/tmMZJLwYnUcu/cMEFesOxnYeJuq20ExfJ
9+
qLSDyLiQ0cx0NTY8g3KwtdD3ImnI8YDEe0CPz2iHJlw5ifFNkU3aiYvkA8ND5b8v
10+
c6OCAYIwggF+MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAq8CCkXjKU5
11+
bXoOzjPHLrPt+8N6MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA4G
12+
A1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYI
13+
KwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j
14+
b20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp
15+
Q2VydEdsb2JhbFJvb3RDQS5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny
16+
bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDA9BgNVHSAE
17+
NjA0MAsGCWCGSAGG/WwCATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgG
18+
BmeBDAECAzANBgkqhkiG9w0BAQwFAAOCAQEAR1mBf9QbH7Bx9phdGLqYR5iwfnYr
19+
6v8ai6wms0KNMeZK6BnQ79oU59cUkqGS8qcuLa/7Hfb7U7CKP/zYFgrpsC62pQsY
20+
kDUmotr2qLcy/JUjS8ZFucTP5Hzu5sn4kL1y45nDHQsFfGqXbbKrAjbYwrwsAZI/
21+
BKOLdRHHuSm8EdCGupK8JvllyDfNJvaGEwwEqonleLHBTnm8dqMLUeTF0J5q/hos
22+
Vq4GNiejcxwIfZMy0MJEGdqN9A57HSgDKwmKdsp33Id6rHtSJlWncg+d0ohP/rEh
23+
xRqhqjn1VtvChMQ1H3Dau0bwhr9kAMQ+959GG50jBbl9s08PqUU643QwmA==
2624
-----END CERTIFICATE-----
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
menu "wolfSSL_client_demo"
1+
menu "Example Configuration"
22

3-
config CERT_AUTH
4-
bool "Enable_cert_authentication"
3+
config EXAMPLE_SERVER_CERT_VERIFY
4+
bool "Enable Server Certificate Verification"
55
default y
66
help
7-
Enabling this flags authenticates the server certificate while establishing a tls connection
7+
Enabling this option validates the server certificate while establishing a TLS connection.
88

9-
endmenu # wolfSSL_client_demo
9+
endmenu # Example Configuration

0 commit comments

Comments
 (0)