TLS Handshake error after migrating from SPM to TFM in SDK 2.1.0

HI


I had some great support in this ticket so I will try my luck again. 

We want to migrate our application from SPM to TFM. We use SDK 2.1.0. We communicate with the cloud using mTLS, setting up our socket as following:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static int setup_socket(const char *server_name, const char *server_ip, int port,
int *sock, struct sockaddr *address, socklen_t addressLen,
int ca_certificate_tag, SOCKET_MANAGER_PEER_VERIFY_t verifyMode) {
const sa_family_t family = AF_INET;
int ret = 0;
memset(address, 0, addressLen);
net_sin(address)->sin_family = AF_INET;
net_sin(address)->sin_port = htons(port);
zsock_inet_pton(family, server_ip, &net_sin(address)->sin_addr);
struct timeval timeout = {
.tv_sec = 5
};
sec_tag_t sec_tag_list_2[] = {
CA2_CERTIFICATE_TAG,
CREDENTIAL_PK_CERTIFICATE_TAG
};
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

This is pretty similar to your psa tls sample.

We used the following (relevant) KConfig Options with SPM: 

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CONFIG_SPM=y
CONFIG_MBEDTLS=y
CONFIG_MBEDTLS_BUILTIN=y
CONFIG_MBEDTLS_ENABLE_HEAP=y
CONFIG_MBEDTLS_HEAP_SIZE=59000
CONFIG_BASE64=y
CONFIG_THREAD_NAME=y
CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384
CONFIG_NET_SOCKETS_SOCKOPT_TLS=y
CONFIG_MBEDTLS_PEM_CERTIFICATE_FORMAT=y
CONFIG_MBEDTLS_SERVER_NAME_INDICATION=y
CONFIG_NET_SOCKETS_TLS_MAX_CONTEXTS=1
CONFIG_MBEDTLS_CIPHER_GCM_ENABLED=y
CONFIG_MBEDTLS_MAC_MD5_ENABLED=n
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

This works fine and stable in the field. I added two log files that show the TSL handshake in that case (not complete) - one with MBED TLS debug enabled, one with TCP debug enabled. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[00:00:15.971,343] <inf> socket_manager: DNS resolved successfully
[00:00:15.971,405] <inf> socket_manager: IP address of assets.yyyyyyy.xxxxxxxx.com is 18.159.121.71
[00:00:15.971,435] <inf> socket_manager: Trying to access 18.159.121.71 on port 443
[00:00:15.971,618] <dbg> net_sock_tls: tls_alloc: (xxxxxxxx_com): Allocated TLS context, 0x20018714
[00:00:15.971,893] <dbg> net_tcp: tcp_conn_ref: (xxxxxxxx_com): conn: 0x2003ad64, ref_count: 1
[00:00:15.971,923] <dbg> net_tcp: tcp_conn_alloc: (xxxxxxxx_com): conn: 0x2003ad64
[00:00:15.972,137] <dbg> net_sock: zsock_socket_internal: (xxxxxxxx_com): socket: ctx=0x200164e0, fd=4
[00:00:15.972,259] <inf> socket_manager: Set TLS socketopt successful
[00:00:15.972,503] <dbg> net_tcp: net_tcp_connect: (xxxxxxxx_com): context: 0x200164e0, local: 0.0.0.0, remote: 18.159.121.71
[00:00:15.972,900] <dbg> net_tcp: net_tcp_connect: (xxxxxxxx_com): conn: 0x2003ad64 src: 172.20.10.9, dst: 18.159.121.71
[00:00:15.973,052] <dbg> net_tcp: tcp_in: (xxxxxxxx_com): [LISTEN Seq=488095434 Ack=0]
[00:00:15.973,724] <dbg> net_tcp: tcp_send: (xxxxxxxx_com): SYN Seq=488095434 Len=0
[00:00:15.974,060] <dbg> net_tcp: tcp_in: (xxxxxxxx_com): LISTEN->SYN_SENT
[00:00:16.078,521] <dbg> net_tcp: tcp_in: (rx_q[0]): SYN,ACK Seq=3671282458 Ack=488095435 Len=0 [SYN_SENT Seq=488095435 Ack=0]
[00:00:16.078,582] <dbg> net_tcp: tcp_options_check: (rx_q[0]): len=4
[00:00:16.078,613] <dbg> net_tcp: tcp_options_check: (rx_q[0]): opt: 2, opt_len: 4
[00:00:16.078,643] <dbg> net_tcp: tcp_options_check: (rx_q[0]): MSS=1410
[00:00:16.078,674] <dbg> net_tcp: tcp_in: (rx_q[0]): Lowering send window from 29200 to 1280
[00:00:16.078,704] <dbg> net_tcp: tcp_window_full: (rx_q[0]): conn: 0x2003ad64 window_full=0
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[00:00:27.729,858] <inf> socket_manager: DNS resolved successfully
[00:00:27.729,919] <inf> socket_manager: IP address of assets.yyyyyyy.xxxxxx.com is 18.159.99.150
[00:00:27.729,949] <inf> socket_manager: Trying to access 18.159.99.150 on port 443
[00:00:27.730,133] <dbg> net_sock_tls: tls_alloc: (xxxxxx_com): Allocated TLS context, 0x20017c70
[00:00:27.730,590] <dbg> net_sock: zsock_socket_internal: (xxxxxx_com): socket: ctx=0x20015a38, fd=4
[00:00:27.730,712] <inf> socket_manager: Set TLS socketopt successful
[00:00:27.788,787] <dbg> net_sock_tls: tls_debug: (xxxxxx_com): ssl_tls.c:5312: |2| => handshake
[00:00:27.788,848] <dbg> net_sock_tls: tls_debug: (xxxxxx_com): ssl_msg.c:1789: |2| => flush output
[00:00:27.788,940] <dbg> net_sock_tls: tls_debug: (xxxxxx_com): ssl_msg.c:1801: |2| <= flush output
[00:00:27.789,001] <dbg> net_sock_tls:com): [00:00:27.789,062] <dbg> net_sock_tls: tls_debug: (xxxxxx_com): ssl_msg.c:1789: |2| => flush output
[00:00:27.789,123] <dbg> net_sock_tls: tls_debug: (xxxxxx_com): ssl_msg.c:1801: |2| <= flush output
[00:00:27.789,215] <dbg> net_sock_tls: tls_debug: (xxxxxx_com): ssl_cli.c:4192: |2| client state: 1
[00:00:27.789,276] <dbg> net_sock_tls: tls_debug: (xxxxxx_com): ssl_cli.c:0933: |2| => write client hello
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Now, we want to migrate from TFM using the following KConfig: 

Fullscreen
1
2
3
4
5
6
7
8
9
10
CONFIG_BUILD_WITH_TFM=y
CONFIG_MBEDTLS_TLS_LIBRARY=y
CONFIG_MBEDTLS_X509_CSR_WRITE_C=y
CONFIG_MBEDTLS_X509_CREATE_C=y
CONFIG_MBEDTLS_PK_WRITE_C=y
CONFIG_MBEDTLS_ECP_C=y
CONFIG_BASE64=y
CONFIG_MBEDTLS_ENABLE_HEAP=y
CONFIG_MBEDTLS_HEAP_SIZE=59000
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

(Notworking KConfig stays the same)

I get a 'net_sock_tls: TLS handshake error: -4c' right at the beginning. I understand that enabling TFM will implicitly enable a custom nordic security backend that is substantially different to the MBED TLS backend used with SPM. 

How can i understand the differences between the old MbedTLS config coming with SPM and the new one when using TFM?

Could you take a look at the logs andhelp me understand what part of the TLS handshake goes wrong? Which KConfig is needed to make it work again? Here are the logs with TFM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[00:01:46.739,746] <inf> socket_manager: DNS resolved successfully
[00:01:46.739,807] <inf> socket_manager: IP address of assets.yyyyyyyy.xxxxxxxx.com is 18.159.99.150
[00:01:46.739,837] <inf> socket_manager: Trying to access 18.159.99.150 on port 443
[00:01:46.739,990] <dbg> net_sock_tls: tls_alloc: (xxxxxxxx_com): Allocated TLS context, 0x20015b3c
[00:01:46.740,295] <dbg> net_tcp: tcp_conn_ref: (xxxxxxxx_com): conn: 0x20038634, ref_count: 1
[00:01:46.740,325] <dbg> net_tcp: tcp_conn_alloc: (xxxxxxxx_com): conn: 0x20038634
[00:01:46.740,905] <dbg> net_sock: zsock_socket_internal: (xxxxxxxx_com): socket: ctx=0x200136d8, fd=4
[00:01:46.741,027] <inf> socket_manager: Set TLS socketopt successful
[00:01:46.741,638] <dbg> net_tcp: net_tcp_connect: (xxxxxxxx_com): context: 0x200136d8, local: 0.0.0.0, remote: 18.159.99.150
[00:01:46.742,797] <dbg> net_tcp: net_tcp_connect: (xxxxxxxx_com): conn: 0x20038634 src: 172.20.10.9, dst: 18.159.99.150
[00:01:46.742,950] <dbg> net_tcp: tcp_in: (xxxxxxxx_com): [LISTEN Seq=3189679833 Ack=0]
[00:01:46.743,225] <dbg> net_tcp: tcp_out_ext: (xxxxxxxx_com): SYN Seq=3189679833 Len=0
[00:01:46.743,377] <dbg> net_tcp: tcp_send_process_no_lock: (xxxxxxxx_com): SYN Seq=3189679833 Len=0
[00:01:46.743,621] <dbg> net_tcp: tcp_send: (xxxxxxxx_com): SYN Seq=3189679833 Len=0
[00:01:46.743,957] <dbg> net_tcp: tcp_in: (xxxxxxxx_com): LISTEN->SYN_SENT
[00:01:46.911,926] <dbg> net_tcp: tcp_in: (rx_q[0]): SYN,ACK Seq=602829136 Ack=3189679834 Len=0 [SYN_SENT Seq=3189679834 Ack=0]
[00:01:46.911,987] <dbg> net_tcp: tcp_options_check: (rx_q[0]): len=4
[00:01:46.912,017] <dbg> net_tcp: tcp_options_check: (rx_q[0]): opt: 2, opt_len: 4
[00:01:46.912,048] <dbg> net_tcp: tcp_options_check: (rx_q[0]): MSS=1410
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


Any help is highly appreciated!