This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nRF9160 Dev Kit MQTT simple + TLS : exception fault while deleting keys

Hi,

Using the nRF9160DK, an orange SIM card, MODEM firmware mfwnrf9160101I managed to make run the sample code: mqtt_simple.using NBIoT

My setup is up to date October 15th, 2019, so I suppose SDK 1.0.0.

Programmer v1.2.3

Segger Embedded Studio R4.18 Build 2019070301.39449

I wanted to add TLS over that sample code.

For now, the targetted TLS should just make use of CA certificate. No client password nor client certificate.

I must say that this is not straightforward and that an official sample code would be very welcome.

To modify the mqtt_simple sample code, I followed instructions from several posts:

https://github.com/joakimtoe/fw-nrfconnect-nrf/commit/36532a8ca60bf7139a988b5cbb4e6cb47948a9fa

https://devzone.nordicsemi.com/f/nordic-q-a/48407/how-to-use-mqtt-tls-in-nrf9160/193461#193461

https://devzone.nordicsemi.com/f/nordic-q-a/49339/implementing-tls-with-mqtt-in-nrf9160/197450#197450

I read in the API and on some forum posts that modifying certificates shall be done before configuring the modem. So, that's pretty much the first thing done in the main.

Also, you'll see that the "auto initialize and connect LTE link" is not checked

main.c:

/*
 * Copyright (c) 2018 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic
 */

#include <zephyr.h>
#include <stdio.h>
#include <uart.h>
#include <string.h>

#include <modem_info.h> //

#include <net/mqtt.h>
#include <net/socket.h>
#include <lte_lc.h>
#if defined(CONFIG_LWM2M_CARRIER)
#include <lwm2m_carrier.h>
#endif


// CERTIFICATES begin
#if defined(CONFIG_PROVISION_CERTIFICATES)
#if defined(CONFIG_BSD_LIBRARY)
#include "nrf_inbuilt_key.h"
#endif
#include CONFIG_CERTIFICATES_FILE
#endif

#if defined(CONFIG_MQTT_LIB_TLS)
	static sec_tag_t sec_tag_list[] = { CONFIG_SEC_TAG };
#endif
// CERTIFICATES end


/* Buffers for MQTT client. */
static u8_t rx_buffer[CONFIG_MQTT_MESSAGE_BUFFER_SIZE];
static u8_t tx_buffer[CONFIG_MQTT_MESSAGE_BUFFER_SIZE];
static u8_t payload_buf[CONFIG_MQTT_PAYLOAD_BUFFER_SIZE];

/* The mqtt client struct */
static struct mqtt_client client;

/* MQTT Broker details. */
static struct sockaddr_storage broker;

/* Connected flag */
static bool connected;

/* File descriptor */
static struct pollfd fds;

#if defined(CONFIG_BSD_LIBRARY)

/**@brief Recoverable BSD library error. */
void bsd_recoverable_error_handler(uint32_t err)
{
	printk("bsdlib recoverable error: %u\n", (unsigned int)err);
}

/**@brief Irrecoverable BSD library error. */
void bsd_irrecoverable_error_handler(uint32_t err)
{
	printk("bsdlib irrecoverable error: %u\n", (unsigned int)err);

	__ASSERT_NO_MSG(false);
}

#endif /* defined(CONFIG_BSD_LIBRARY) */

#if defined(CONFIG_LWM2M_CARRIER)
K_SEM_DEFINE(carrier_registered, 0, 1);

void lwm2m_carrier_event_handler(const lwm2m_carrier_event_t *event)
{
	switch (event->type) {
	case LWM2M_CARRIER_EVENT_BSDLIB_INIT:
		printk("LWM2M_CARRIER_EVENT_BSDLIB_INIT\n");
		break;
	case LWM2M_CARRIER_EVENT_CONNECT:
		printk("LWM2M_CARRIER_EVENT_CONNECT\n");
		break;
	case LWM2M_CARRIER_EVENT_DISCONNECT:
		printk("LWM2M_CARRIER_EVENT_DISCONNECT\n");
		break;
	case LWM2M_CARRIER_EVENT_READY:
		printk("LWM2M_CARRIER_EVENT_READY\n");
		k_sem_give(&carrier_registered);
		break;
	case LWM2M_CARRIER_EVENT_FOTA_START:
		printk("LWM2M_CARRIER_EVENT_FOTA_START\n");
		break;
	case LWM2M_CARRIER_EVENT_REBOOT:
		printk("LWM2M_CARRIER_EVENT_REBOOT\n");
		break;
	}
}
#endif /* defined(CONFIG_LWM2M_CARRIER) */

/**@brief Function to print strings without null-termination
 */
static void data_print(u8_t *prefix, u8_t *data, size_t len)
{
	char buf[len + 1];

	memcpy(buf, data, len);
	buf[len] = 0;
	printk("%s%s\n", prefix, buf);
}

/**@brief Function to publish data on the configured topic
 */
static int data_publish(struct mqtt_client *c, enum mqtt_qos qos,
	u8_t *data, size_t len)
{
	struct mqtt_publish_param param;

	param.message.topic.qos = qos;
	param.message.topic.topic.utf8 = CONFIG_MQTT_PUB_TOPIC;
	param.message.topic.topic.size = strlen(CONFIG_MQTT_PUB_TOPIC);
	param.message.payload.data = data;
	param.message.payload.len = len;
	param.message_id = sys_rand32_get();
	param.dup_flag = 0;
	param.retain_flag = 0;

	data_print("Publishing: ", data, len);
	printk("to topic: %s len: %u\n",
		CONFIG_MQTT_PUB_TOPIC,
		(unsigned int)strlen(CONFIG_MQTT_PUB_TOPIC));

	return mqtt_publish(c, &param);
}

/**@brief Function to subscribe to the configured topic
 */
static int subscribe(void)
{
	struct mqtt_topic subscribe_topic = {
		.topic = {
			.utf8 = CONFIG_MQTT_SUB_TOPIC,
			.size = strlen(CONFIG_MQTT_SUB_TOPIC)
		},
		.qos = MQTT_QOS_1_AT_LEAST_ONCE
	};

	const struct mqtt_subscription_list subscription_list = {
		.list = &subscribe_topic,
		.list_count = 1,
		.message_id = 1234
	};

	printk("Subscribing to: %s len %u\n", CONFIG_MQTT_SUB_TOPIC,
		(unsigned int)strlen(CONFIG_MQTT_SUB_TOPIC));

	return mqtt_subscribe(&client, &subscription_list);
}

/**@brief Function to read the published payload.
 */
static int publish_get_payload(struct mqtt_client *c, size_t length)
{
	u8_t *buf = payload_buf;
	u8_t *end = buf + length;

	if (length > sizeof(payload_buf)) {
		return -EMSGSIZE;
	}

	while (buf < end) {
		int ret = mqtt_read_publish_payload(c, buf, end - buf);

		if (ret < 0) {
			int err;

			if (ret != -EAGAIN) {
				return ret;
			}

			printk("mqtt_read_publish_payload: EAGAIN\n");

			err = poll(&fds, 1, K_SECONDS(CONFIG_MQTT_KEEPALIVE));
			if (err > 0 && (fds.revents & POLLIN) == POLLIN) {
				continue;
			} else {
				return -EIO;
			}
		}

		if (ret == 0) {
			return -EIO;
		}

		buf += ret;
	}

	return 0;
}

/**@brief MQTT client event handler
 */
void mqtt_evt_handler(struct mqtt_client *const c,
		      const struct mqtt_evt *evt)
{
	int err;

	switch (evt->type) {
	case MQTT_EVT_CONNACK:
		if (evt->result != 0) {
			printk("MQTT connect failed %d\n", evt->result);
			break;
		}

		connected = true;
		printk("[%s:%d] MQTT client connected!\n", __func__, __LINE__);
		subscribe();
		break;

	case MQTT_EVT_DISCONNECT:
		printk("[%s:%d] MQTT client disconnected %d\n", __func__,
		       __LINE__, evt->result);

		connected = false;
		break;

	case MQTT_EVT_PUBLISH: {
		const struct mqtt_publish_param *p = &evt->param.publish;

		printk("[%s:%d] MQTT PUBLISH result=%d len=%d\n", __func__,
		       __LINE__, evt->result, p->message.payload.len);
		err = publish_get_payload(c, p->message.payload.len);
		if (err >= 0) {
			data_print("Received: ", payload_buf,
				p->message.payload.len);
			/* Echo back received data */
			data_publish(&client, MQTT_QOS_1_AT_LEAST_ONCE,
				payload_buf, p->message.payload.len);
		} else {
			printk("mqtt_read_publish_payload: Failed! %d\n", err);
			printk("Disconnecting MQTT client...\n");

			err = mqtt_disconnect(c);
			if (err) {
				printk("Could not disconnect: %d\n", err);
			}
		}
	} break;

	case MQTT_EVT_PUBACK:
		if (evt->result != 0) {
			printk("MQTT PUBACK error %d\n", evt->result);
			break;
		}

		printk("[%s:%d] PUBACK packet id: %u\n", __func__, __LINE__,
				evt->param.puback.message_id);
		break;

	case MQTT_EVT_SUBACK:
		if (evt->result != 0) {
			printk("MQTT SUBACK error %d\n", evt->result);
			break;
		}

		printk("[%s:%d] SUBACK packet id: %u\n", __func__, __LINE__,
				evt->param.suback.message_id);
		break;

	default:
		printk("[%s:%d] default: %d\n", __func__, __LINE__,
				evt->type);
		break;
	}
}

/**@brief Resolves the configured hostname and
 * initializes the MQTT broker structure
 */
static void broker_init(void)
{
	int err;
	struct addrinfo *result;
	struct addrinfo *addr;
	struct addrinfo hints = {
		.ai_family = AF_INET,
		.ai_socktype = SOCK_STREAM
	};

	err = getaddrinfo(CONFIG_MQTT_BROKER_HOSTNAME, NULL, &hints, &result);
	if (err) {
		printk("ERROR: getaddrinfo failed %d\n", err);

		return;
	}

	addr = result;
	err = -ENOENT;

	/* Look for address of the broker. */
	while (addr != NULL) {
		/* IPv4 Address. */
		if (addr->ai_addrlen == sizeof(struct sockaddr_in)) {
			struct sockaddr_in *broker4 =
				((struct sockaddr_in *)&broker);
			char ipv4_addr[NET_IPV4_ADDR_LEN];

			broker4->sin_addr.s_addr =
				((struct sockaddr_in *)addr->ai_addr)
				->sin_addr.s_addr;
			broker4->sin_family = AF_INET;
			broker4->sin_port = htons(CONFIG_MQTT_BROKER_PORT);

			inet_ntop(AF_INET, &broker4->sin_addr.s_addr,
				  ipv4_addr, sizeof(ipv4_addr));
			printk("IPv4 Address found %s\n", ipv4_addr);

			break;
		} else {
			printk("ai_addrlen = %u should be %u or %u\n",
				(unsigned int)addr->ai_addrlen,
				(unsigned int)sizeof(struct sockaddr_in),
				(unsigned int)sizeof(struct sockaddr_in6));
		}

		addr = addr->ai_next;
		break;
	}

	/* Free the address. */
	freeaddrinfo(result);
}

/**@brief Initialize the MQTT client structure
 */
static void client_init(struct mqtt_client *client)
{
	mqtt_client_init(client);

	broker_init();

	/* MQTT client configuration */
	client->broker = &broker;
	client->evt_cb = mqtt_evt_handler;
	client->client_id.utf8 = (u8_t *)CONFIG_MQTT_CLIENT_ID;
	client->client_id.size = strlen(CONFIG_MQTT_CLIENT_ID);
	client->password = NULL;
	client->user_name = NULL;
	client->protocol_version = MQTT_VERSION_3_1_1;

	/* MQTT buffers configuration */
	client->rx_buf = rx_buffer;
	client->rx_buf_size = sizeof(rx_buffer);
	client->tx_buf = tx_buffer;
	client->tx_buf_size = sizeof(tx_buffer);

        /* modif begin*/
        #if defined(CONFIG_MQTT_LIB_TLS)
           client->transport.type = MQTT_TRANSPORT_SECURE;
           client->transport.tls.config.peer_verify = 2;
           client->transport.tls.config.cipher_count = 0;
           client->transport.tls.config.cipher_list = NULL;
           client->transport.tls.config.sec_tag_count = ARRAY_SIZE(sec_tag_list);
           client->transport.tls.config.sec_tag_list = sec_tag_list;
           client->transport.tls.config.hostname = CONFIG_MQTT_BROKER_HOSTNAME;
        #else
          /* MQTT transport configuration */
          client->transport.type = MQTT_TRANSPORT_NON_SECURE;
        #endif
        /* modif end*/

}

/**@brief Initialize the file descriptor structure used by poll.
 */
static int fds_init(struct mqtt_client *c)
{
	if (c->transport.type == MQTT_TRANSPORT_NON_SECURE) {
		fds.fd = c->transport.tcp.sock;
	} else {
#if defined(CONFIG_MQTT_LIB_TLS)
		fds.fd = c->transport.tls.sock;
#else
		return -ENOTSUP;
#endif
	}

	fds.events = POLLIN;

	return 0;
}

/**@brief Configures modem to provide LTE link. Blocks until link is
 * successfully established.
 */
static void modem_configure(void)
{
#if defined(CONFIG_LTE_LINK_CONTROL)
	if (IS_ENABLED(CONFIG_LTE_AUTO_INIT_AND_CONNECT)) {
		/* Do nothing, modem is already turned on
		 * and connected.
		 */
	} else {
#if defined(CONFIG_LWM2M_CARRIER)
		/* Wait for the LWM2M_CARRIER to configure the modem and
		 * start the connection.
		 */
		printk("Waitng for carrier registration...\n");
		k_sem_take(&carrier_registered, K_FOREVER);
		printk("Registered!\n");
#else /* defined(CONFIG_LWM2M_CARRIER) */
		int err;

		printk("LTE Link Connecting ...\n");
		err = lte_lc_init_and_connect();
		__ASSERT(err == 0, "LTE link could not be established.");
		printk("LTE Link Connected!\n");
#endif /* defined(CONFIG_LWM2M_CARRIER) */
	}
#endif /* defined(CONFIG_LTE_LINK_CONTROL) */
}



static int provision_certificate(void);

void main(void)
{
	int err;

        char pIPbuffer[256]; 
        volatile int rt = 0;
        struct modem_param_info modem_param; 

	printk("The MQTT simple sample started\n");

        //_CERTIFICATES begin
        provision_certificate();
        //_CERTIFICATES end

	modem_configure();

        //_CHECK_MODULE_IPADDR begin
 
        rt = modem_info_init();
        printk("modem_info_init rt = %d \n", rt); 

        rt = modem_info_string_get(MODEM_INFO_IP_ADDRESS, pIPbuffer);
        printk("modem_info_string_get rt = %d \n", rt); 

        if( modem_info_params_init(&modem_param) == 0)
        {
           rt = modem_info_params_get(&modem_param);
           printk("modem_info_params_get rt = %d \n", rt);  
        }
        
        printk("IP: %s", pIPbuffer); 
        //_CHECK_MODULE_IPADDR end



	client_init(&client);

	err = mqtt_connect(&client);
	if (err != 0) {
		printk("ERROR: mqtt_connect %d\n", err);
		return;
	}

	err = fds_init(&client);
	if (err != 0) {
		printk("ERROR: fds_init %d\n", err);
		return;
	}

	while (1) {
		err = poll(&fds, 1, K_SECONDS(CONFIG_MQTT_KEEPALIVE));
		if (err < 0) {
			printk("ERROR: poll %d\n", errno);
			break;
		}

		err = mqtt_live(&client);
		if (err != 0) {
			printk("ERROR: mqtt_live %d\n", err);
			break;
		}

		if ((fds.revents & POLLIN) == POLLIN) {
			err = mqtt_input(&client);
			if (err != 0) {
				printk("ERROR: mqtt_input %d\n", err);
				break;
			}
		}

		if ((fds.revents & POLLERR) == POLLERR) {
			printk("POLLERR\n");
			break;
		}

		if ((fds.revents & POLLNVAL) == POLLNVAL) {
			printk("POLLNVAL\n");
			break;
		}
	}

	printk("Disconnecting MQTT client...\n");

	err = mqtt_disconnect(&client);
	if (err) {
		printk("Could not disconnect MQTT client. Error: %d\n", err);
	}
}


// CERTIFICATES begin


static int provision_certificate(void)
{

#if defined(CONFIG_PROVISION_CERTIFICATES)
#if defined(CONFIG_BSD_LIBRARY)
	{
		int err;

		/* Delete certificates */
		nrf_sec_tag_t sec_tag = (nrf_sec_tag_t) sec_tag_list[0];

		for (nrf_key_mgnt_cred_type_t type = 0; type < 5; type++) {
			printk("Deleting certs sec_tag: %d\n", sec_tag);
			err = nrf_inbuilt_key_delete(sec_tag, type);
			printk("nrf_inbuilt_key_delete(%u, %d) => result=%d\n",
				sec_tag, type, err);
		}
#if defined(CA_CERTIFICATE)
		/* Provision CA Certificate. */
		printk("Write ca certs sec_tag: %d\n", sec_tag);
		err = nrf_inbuilt_key_write(sec_tag,
			NRF_KEY_MGMT_CRED_TYPE_CA_CHAIN,
			CA_CERTIFICATE,
			strlen(CA_CERTIFICATE));
		if (err) {
			printk("CA_CERTIFICATE err: %d\n", err);
			return err;
		}
#endif
        }

#endif /* defined(CONFIG_BSD_LIBRARY) */
#endif /* defined(CONFIG_PROVISION_CERTIFICATES) */

	return 0;
}

#if 0

static int provision_certificate(void)
{
#if defined(CONFIG_PROVISION_CERTIFICATES)
#if defined(CONFIG_BSD_LIBRARY)
	{
		int err;

		/* Delete certificates */
		nrf_sec_tag_t sec_tag = (nrf_sec_tag_t) sec_tag_list[0];

		for (nrf_key_mgnt_cred_type_t type = 0; type < 5; type++) {
			printk("Deleting certs sec_tag: %d\n", sec_tag);
			err = nrf_inbuilt_key_delete(sec_tag, type);
			printk("nrf_inbuilt_key_delete(%u, %d) => result=%d\n",
				sec_tag, type, err);
		}

#if defined(CA_CERTIFICATE)
		/* Provision CA Certificate. */
		printk("Write ca certs sec_tag: %d\n", sec_tag);
		err = nrf_inbuilt_key_write(sec_tag,
			NRF_KEY_MGMT_CRED_TYPE_CA_CHAIN,
			CA_CERTIFICATE,
			strlen(CA_CERTIFICATE));
		if (err) {
			printk("CA_CERTIFICATE err: %d\n", err);
			return err;
		}
#endif
#if defined (CLIENT_PRIVATE_KEY)
		/* Provision Private Certificate. */
		printk("Write private cert sec_tag: %d\n", sec_tag);
		err = nrf_inbuilt_key_write(
			sec_tag,
			NRF_KEY_MGMT_CRED_TYPE_PRIVATE_CERT,
			CLIENT_PRIVATE_KEY,
			strlen(CLIENT_PRIVATE_KEY));
		if (err) {
			printk("CLIENT_PRIVATE_KEY err: %d\n", err);
			return err;
		}
#endif
#if defined(CLIENT_PUBLIC_CERTIFICATE)
		/* Provision Public Certificate. */
		printk("Write public cert sec_tag: %d\n", sec_tag);
		err = nrf_inbuilt_key_write(
			sec_tag,
			NRF_KEY_MGMT_CRED_TYPE_PUBLIC_CERT,
			CLIENT_PUBLIC_CERTIFICATE,
			strlen(CLIENT_PUBLIC_CERTIFICATE));
		if (err) {
			printk("CLIENT_PUBLIC_CERTIFICATE err: %d\n",
				err);
			return err;
		}
	}
#endif
#else
	{
		int err;

		err = tls_credential_add(CONFIG_SEC_TAG,
			TLS_CREDENTIAL_CA_CERTIFICATE,
			NRF_CLOUD_CA_CERTIFICATE,
			sizeof(NRF_CLOUD_CA_CERTIFICATE));
		if (err < 0) {
			printk("Failed to register ca certificate: %d\n",
				err);
			return err;
		}
		err = tls_credential_add(CONFIG_SEC_TAG,
			TLS_CREDENTIAL_PRIVATE_KEY,
			NRF_CLOUD_CLIENT_PRIVATE_KEY,
			sizeof(NRF_CLOUD_CLIENT_PRIVATE_KEY));
		if (err < 0) {
			printk("Failed to register private key: %d\n",
				err);
			return err;
		}
		err = tls_credential_add(CONFIG_SEC_TAG,
			TLS_CREDENTIAL_SERVER_CERTIFICATE,
			NRF_CLOUD_CLIENT_PUBLIC_CERTIFICATE,
			sizeof(NRF_CLOUD_CLIENT_PUBLIC_CERTIFICATE));
		if (err < 0) {
			printk("Failed to register public certificate: %d\n",
				err);
			return err;
		}

	}
#endif /* defined(CONFIG_BSD_LIBRARY) */
#endif /* defined(CONFIG_PROVISION_CERTIFICATES) */

	return 0;
}

#endif

// CERTIFICATES end

ncs\nrf\samples\nrf9160\mqtt_simple\\prj.conf:

#
# Copyright (c) 2019 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic
#
# General config
CONFIG_TEST_RANDOM_GENERATOR=y

# Networking
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS_OFFLOAD=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y

# LTE link control
CONFIG_LTE_LINK_CONTROL=y
CONFIG_LTE_AUTO_INIT_AND_CONNECT=n
CONFIG_NRF_CLOUD_PROVISION_CERTIFICATES=y

# BSD library
CONFIG_BSD_LIBRARY=y

# AT Host
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_AT_HOST_LIBRARY=y

# MQTT
CONFIG_MQTT_LIB=y
CONFIG_MQTT_LIB_TLS=y

# Appliaction
#CONFIG_MQTT_PUB_TOPIC="/my/publish/topic"
#CONFIG_MQTT_SUB_TOPIC="/my/subscribe/topic"
#CONFIG_MQTT_CLIENT_ID="my-client-id"
#CONFIG_MQTT_BROKER_HOSTNAME="mqtt.eclipse.org"
#CONFIG_MQTT_BROKER_PORT=1883

CONFIG_SEC_TAG=16842753

CONFIG_PROVISION_CERTIFICATES=y
CONFIG_CERTIFICATES_FILE="certificates.h"

# Main thread
CONFIG_MAIN_THREAD_PRIORITY=7
CONFIG_MAIN_STACK_SIZE=4096

CONFIG_HEAP_MEM_POOL_SIZE=2048

# Disable native network stack to save some memory
CONFIG_NET_IPV4=n
CONFIG_NET_IPV6=n
CONFIG_NET_UDP=n
CONFIG_NET_TCP=n

ncs\nrf\samples\nrf9160\mqtt_simple\\Kconfig:

#
# Copyright (c) 2018 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic
#

menu "MQTT simple sample"


config PROVISION_CERTIFICATES
	bool "Provision of certificate"
	help
		Enable run-time provisioning of certificates from the
		certificates header file selected by using CERTIFICATES_FILE

config CERTIFICATES_FILE
	string "Certificates to use"
	depends on PROVISION_CERTIFICATES
	default "certificates.h"

config SEC_TAG
	int "Security tag to use for the connection"
	default 1

config MQTT_PUB_TOPIC
	string "MQTT publish topic"
	default "my/publish/topic"

config MQTT_SUB_TOPIC
	string "MQTT subscribe topic"
	default "my/subscribe/topic"

config MQTT_CLIENT_ID
	string "MQTT Client ID"
	default "my-client-id"

config MQTT_BROKER_HOSTNAME
	string "MQTT broker hostname"
	default "mqtt.eclipse.org"

config MQTT_BROKER_PORT
	int "MQTT broker port"
	default 8883

config MQTT_MESSAGE_BUFFER_SIZE
	int "MQTT message buffer size"
	default 128

config MQTT_PAYLOAD_BUFFER_SIZE
	int "MQTT payload buffer size"
	default 128

endmenu

menu "Zephyr Kernel"
source "$ZEPHYR_BASE/Kconfig.zephyr"
endmenu

ncs\nrf\samples\nrf9160\mqtt_simple\build_nrf9160_pca10090ns\zephyr\include\generated\autoconf.h:

/* Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib) */
#define CONFIG_PROVISION_CERTIFICATES 1
#define CONFIG_CERTIFICATES_FILE "certificates.h"
#define CONFIG_SEC_TAG 16842753
#define CONFIG_MQTT_PUB_TOPIC "my/publish/topic"
#define CONFIG_MQTT_SUB_TOPIC "my/subscribe/topic"
#define CONFIG_MQTT_CLIENT_ID "my-client-id"
#define CONFIG_MQTT_BROKER_HOSTNAME "62.197.103.46"
#define CONFIG_MQTT_BROKER_PORT 8883
#define CONFIG_MQTT_MESSAGE_BUFFER_SIZE 128
#define CONFIG_MQTT_PAYLOAD_BUFFER_SIZE 128
#define CONFIG_MQTT_KEEPALIVE 60
#define CONFIG_MQTT_LIB_TLS 1
#define CONFIG_SPM 1
#define CONFIG_SPM_BUILD_STRATEGY_FROM_SOURCE 1
#define CONFIG_ARM_ENTRY_VENEERS_LIB_NAME "libspmsecureentries.a"
#define CONFIG_BSD_LIBRARY 1
#define CONFIG_BSD_LIBRARY_SYS_INIT 1
#define CONFIG_AT_HOST_LIBRARY 1
#define CONFIG_AT_HOST_UART_0 1
#define CONFIG_AT_HOST_UART 0
#define CONFIG_AT_HOST_UART_INIT_TIMEOUT 500
#define CONFIG_CR_TERMINATION 1
#define CONFIG_AT_HOST_TERMINATION 1
#define CONFIG_AT_CMD_PARSER 1
#define CONFIG_MODEM_INFO 1
#define CONFIG_MODEM_INFO_MAX_AT_PARAMS_RSP 10
#define CONFIG_MODEM_INFO_BUFFER_SIZE 128
#define CONFIG_MODEM_INFO_ADD_NETWORK 1
#define CONFIG_MODEM_INFO_ADD_SIM 1
#define CONFIG_MODEM_INFO_ADD_SIM_ICCID 1
#define CONFIG_MODEM_INFO_ADD_SIM_IMSI 1
#define CONFIG_MODEM_INFO_ADD_DEVICE 1
#define CONFIG_MODEM_INFO_ADD_BOARD 1
#define CONFIG_AT_CMD 1
#define CONFIG_AT_CMD_SYS_INIT 1
#define CONFIG_AT_CMD_INIT_PRIORITY 40
#define CONFIG_AT_CMD_THREAD_PRIO 10
#define CONFIG_AT_CMD_THREAD_STACK_SIZE 1024
#define CONFIG_AT_CMD_RESPONSE_MAX_LEN 2700
#define CONFIG_AT_CMD_RESPONSE_BUFFER_COUNT 2
#define CONFIG_LTE_LINK_CONTROL 1
#define CONFIG_LTE_PSM_REQ_RPTAU "00000011"
#define CONFIG_LTE_PSM_REQ_RAT "00100001"
#define CONFIG_LTE_EDRX_REQ_ACTT_TYPE "4"
#define CONFIG_LTE_EDRX_REQ_VALUE "1000"
#define CONFIG_LTE_NETWORK_MODE_LTE_M 1
#define CONFIG_LTE_NETWORK_USE_FALLBACK 1
#define CONFIG_LTE_NETWORK_TIMEOUT 600
#define CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL 1
#define CONFIG_CLOCK_CONTROL_NRF_K32SRC_20PPM 1
#define CONFIG_BOOT_SIGNATURE_KEY_FILE "root-rsa-2048.pem"
#define CONFIG_BSD_LIB 1
#define CONFIG_NRFXLIB_CRYPTO 1
#define CONFIG_NRF_OBERON 1
#define CONFIG_MBEDTLS_TLS_VERSION_1_2 1
#define CONFIG_MBEDTLS_KEY_EXCHANGE_RSA_ENABLED 1
#define CONFIG_MBEDTLS_CIPHER_AES_ENABLED 1
#define CONFIG_MBEDTLS_AES_ROM_TABLES 1
#define CONFIG_MBEDTLS_CIPHER_DES_ENABLED 1
#define CONFIG_MBEDTLS_CIPHER_CBC_ENABLED 1
#define CONFIG_MBEDTLS_MAC_MD5_ENABLED 1
#define CONFIG_MBEDTLS_MAC_SHA1_ENABLED 1
#define CONFIG_MBEDTLS_MAC_SHA256_ENABLED 1
#define CONFIG_MBEDTLS_SHA256_SMALLER 1
#define CONFIG_MBEDTLS_CTR_DRBG_ENABLED 1
#define CONFIG_HAS_NRFX 1
#define CONFIG_BOARD "nrf9160_pca10090"
#define CONFIG_FLASH_LOAD_SIZE 0x40000
#define CONFIG_FLASH_LOAD_OFFSET 0x40000
#define CONFIG_SOC "nRF9160_SICA"
#define CONFIG_SOC_SERIES "nrf91"
#define CONFIG_NUM_IRQS 65
#define CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC 32768
#define CONFIG_GPIO 1
#define CONFIG_ISR_STACK_SIZE 2048
#define CONFIG_CLOCK_CONTROL 1
#define CONFIG_NRF_RTC_TIMER 1
#define CONFIG_SYS_CLOCK_TICKS_PER_SEC 32768
#define CONFIG_ARCH_HAS_CUSTOM_BUSY_WAIT 1
#define CONFIG_SYS_POWER_MANAGEMENT 1
#define CONFIG_BUILD_OUTPUT_HEX 1
#define CONFIG_FLOAT 1
#define CONFIG_TEXT_SECTION_OFFSET 0x0
#define CONFIG_FLASH_SIZE 1024
#define CONFIG_FLASH_BASE_ADDRESS 0x0
#define CONFIG_SRAM_SIZE 128
#define CONFIG_SRAM_BASE_ADDRESS 0x20020000
#define CONFIG_SOC_GECKO_EMU 1
#define CONFIG_BOARD_NRF9160_PCA10090NS 1
#define CONFIG_SOC_SERIES_NRF91X 1
#define CONFIG_CPU_HAS_ARM_MPU 1
#define CONFIG_CPU_HAS_NRF_IDAU 1
#define CONFIG_SOC_FAMILY "nordic_nrf"
#define CONFIG_SOC_FAMILY_NRF 1
#define CONFIG_HAS_HW_NRF_CC310 1
#define CONFIG_HAS_HW_NRF_CLOCK 1
#define CONFIG_HAS_HW_NRF_DPPIC 1
#define CONFIG_HAS_HW_NRF_EGU0 1
#define CONFIG_HAS_HW_NRF_EGU1 1
#define CONFIG_HAS_HW_NRF_EGU2 1
#define CONFIG_HAS_HW_NRF_EGU3 1
#define CONFIG_HAS_HW_NRF_EGU4 1
#define CONFIG_HAS_HW_NRF_EGU5 1
#define CONFIG_HAS_HW_NRF_GPIO0 1
#define CONFIG_HAS_HW_NRF_GPIOTE 1
#define CONFIG_HAS_HW_NRF_I2S 1
#define CONFIG_HAS_HW_NRF_IPC 1
#define CONFIG_HAS_HW_NRF_PDM 1
#define CONFIG_HAS_HW_NRF_POWER 1
#define CONFIG_HAS_HW_NRF_PWM0 1
#define CONFIG_HAS_HW_NRF_PWM1 1
#define CONFIG_HAS_HW_NRF_PWM2 1
#define CONFIG_HAS_HW_NRF_PWM3 1
#define CONFIG_HAS_HW_NRF_RTC0 1
#define CONFIG_HAS_HW_NRF_RTC1 1
#define CONFIG_HAS_HW_NRF_SAADC 1
#define CONFIG_HAS_HW_NRF_SPIM0 1
#define CONFIG_HAS_HW_NRF_SPIM1 1
#define CONFIG_HAS_HW_NRF_SPIM2 1
#define CONFIG_HAS_HW_NRF_SPIM3 1
#define CONFIG_HAS_HW_NRF_SPIS0 1
#define CONFIG_HAS_HW_NRF_SPIS1 1
#define CONFIG_HAS_HW_NRF_SPIS2 1
#define CONFIG_HAS_HW_NRF_SPIS3 1
#define CONFIG_HAS_HW_NRF_SPU 1
#define CONFIG_HAS_HW_NRF_TIMER0 1
#define CONFIG_HAS_HW_NRF_TIMER1 1
#define CONFIG_HAS_HW_NRF_TIMER2 1
#define CONFIG_HAS_HW_NRF_TWIM0 1
#define CONFIG_HAS_HW_NRF_TWIM1 1
#define CONFIG_HAS_HW_NRF_TWIM2 1
#define CONFIG_HAS_HW_NRF_TWIM3 1
#define CONFIG_HAS_HW_NRF_TWIS0 1
#define CONFIG_HAS_HW_NRF_TWIS1 1
#define CONFIG_HAS_HW_NRF_TWIS2 1
#define CONFIG_HAS_HW_NRF_TWIS3 1
#define CONFIG_HAS_HW_NRF_UARTE0 1
#define CONFIG_HAS_HW_NRF_UARTE1 1
#define CONFIG_HAS_HW_NRF_UARTE2 1
#define CONFIG_HAS_HW_NRF_UARTE3 1
#define CONFIG_HAS_HW_NRF_WDT 1
#define CONFIG_NRF_ENABLE_ICACHE 1
#define CONFIG_SOC_NRF9160 1
#define CONFIG_SOC_NRF9160_SICA 1
#define CONFIG_SOC_COMPATIBLE_NRF 1
#define CONFIG_CPU_CORTEX 1
#define CONFIG_CPU_CORTEX_M 1
#define CONFIG_ISA_THUMB2 1
#define CONFIG_DATA_ENDIANNESS_LITTLE 1
#define CONFIG_STACK_ALIGN_DOUBLE_WORD 1
#define CONFIG_FAULT_DUMP 2
#define CONFIG_ARM_NONSECURE_FIRMWARE 1
#define CONFIG_ARM_FIRMWARE_USES_SECURE_ENTRY_FUNCS 1
#define CONFIG_FP_HARDABI 1
#define CONFIG_CPU_CORTEX_M33 1
#define CONFIG_CPU_CORTEX_M_HAS_SYSTICK 1
#define CONFIG_CPU_CORTEX_M_HAS_BASEPRI 1
#define CONFIG_CPU_CORTEX_M_HAS_VTOR 1
#define CONFIG_CPU_CORTEX_M_HAS_SPLIM 1
#define CONFIG_CPU_CORTEX_M_HAS_PROGRAMMABLE_FAULT_PRIOS 1
#define CONFIG_CPU_CORTEX_M_HAS_CMSE 1
#define CONFIG_ARMV7_M_ARMV8_M_MAINLINE 1
#define CONFIG_ARMV8_M_MAINLINE 1
#define CONFIG_ARMV8_M_SE 1
#define CONFIG_ARMV7_M_ARMV8_M_FP 1
#define CONFIG_ARMV8_M_DSP 1
#define CONFIG_LDREX_STREX_AVAILABLE 1
#define CONFIG_XIP 1
#define CONFIG_GEN_ISR_TABLES 1
#define CONFIG_PLATFORM_SPECIFIC_INIT 1
#define CONFIG_GEN_IRQ_VECTOR_TABLE 1
#define CONFIG_ARM_MPU 1
#define CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE 32
#define CONFIG_ARM_TRUSTZONE_M 1
#define CONFIG_ARCH "arm"
#define CONFIG_ARM 1
#define CONFIG_TRUSTED_EXECUTION_NONSECURE 1
#define CONFIG_PRIVILEGED_STACK_SIZE 1024
#define CONFIG_PRIVILEGED_STACK_TEXT_AREA 256
#define CONFIG_KOBJECT_TEXT_AREA 256
#define CONFIG_GEN_SW_ISR_TABLE 1
#define CONFIG_ARCH_SW_ISR_TABLE_ALIGN 0
#define CONFIG_GEN_IRQ_START_VECTOR 0
#define CONFIG_ARCH_HAS_TRUSTED_EXECUTION 1
#define CONFIG_ARCH_HAS_STACK_PROTECTION 1
#define CONFIG_ARCH_HAS_USERSPACE 1
#define CONFIG_ARCH_HAS_EXECUTABLE_PAGE_BIT 1
#define CONFIG_ARCH_HAS_RAMFUNC_SUPPORT 1
#define CONFIG_ARCH_HAS_THREAD_ABORT 1
#define CONFIG_HAS_SYS_POWER_STATE_DEEP_SLEEP_1 1
#define CONFIG_CPU_HAS_TEE 1
#define CONFIG_CPU_HAS_FPU 1
#define CONFIG_CPU_HAS_MPU 1
#define CONFIG_MEMORY_PROTECTION 1
#define CONFIG_MPU_REQUIRES_NON_OVERLAPPING_REGIONS 1
#define CONFIG_FP_SHARING 1
#define CONFIG_MULTITHREADING 1
#define CONFIG_NUM_COOP_PRIORITIES 16
#define CONFIG_NUM_PREEMPT_PRIORITIES 15
#define CONFIG_MAIN_THREAD_PRIORITY 7
#define CONFIG_COOP_ENABLED 1
#define CONFIG_PREEMPT_ENABLED 1
#define CONFIG_PRIORITY_CEILING 0
#define CONFIG_NUM_METAIRQ_PRIORITIES 0
#define CONFIG_MAIN_STACK_SIZE 4096
#define CONFIG_IDLE_STACK_SIZE 320
#define CONFIG_THREAD_STACK_INFO 1
#define CONFIG_ERRNO 1
#define CONFIG_SCHED_DUMB 1
#define CONFIG_WAITQ_DUMB 1
#define CONFIG_BOOT_BANNER 1
#define CONFIG_BOOT_DELAY 0
#define CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE 1024
#define CONFIG_SYSTEM_WORKQUEUE_PRIORITY -1
#define CONFIG_OFFLOAD_WORKQUEUE_STACK_SIZE 1024
#define CONFIG_OFFLOAD_WORKQUEUE_PRIORITY -1
#define CONFIG_ATOMIC_OPERATIONS_BUILTIN 1
#define CONFIG_TIMESLICING 1
#define CONFIG_TIMESLICE_SIZE 0
#define CONFIG_TIMESLICE_PRIORITY 0
#define CONFIG_POLL 1
#define CONFIG_NUM_MBOX_ASYNC_MSGS 10
#define CONFIG_NUM_PIPE_ASYNC_MSGS 10
#define CONFIG_HEAP_MEM_POOL_SIZE 2048
#define CONFIG_HEAP_MEM_POOL_MIN_SIZE 64
#define CONFIG_ARCH_HAS_CUSTOM_SWAP_TO_MAIN 1
#define CONFIG_SWAP_NONATOMIC 1
#define CONFIG_SYS_CLOCK_EXISTS 1
#define CONFIG_KERNEL_INIT_PRIORITY_OBJECTS 30
#define CONFIG_KERNEL_INIT_PRIORITY_DEFAULT 40
#define CONFIG_KERNEL_INIT_PRIORITY_DEVICE 50
#define CONFIG_APPLICATION_INIT_PRIORITY 90
#define CONFIG_STACK_POINTER_RANDOM 0
#define CONFIG_MP_NUM_CPUS 1
#define CONFIG_TICKLESS_IDLE 1
#define CONFIG_TICKLESS_IDLE_THRESH 3
#define CONFIG_TICKLESS_KERNEL 1
#define CONFIG_SYS_PM_POLICY_RESIDENCY 1
#define CONFIG_SYS_PM_MIN_RESIDENCY_DEEP_SLEEP_1 60000
#define CONFIG_HAS_DTS 1
#define CONFIG_HAS_DTS_GPIO 1
#define CONFIG_UART_CONSOLE_ON_DEV_NAME "UART_0"
#define CONFIG_CONSOLE 1
#define CONFIG_CONSOLE_INPUT_MAX_LINE_LEN 128
#define CONFIG_CONSOLE_HAS_DRIVER 1
#define CONFIG_UART_CONSOLE 1
#define CONFIG_UART_CONSOLE_INIT_PRIORITY 60
#define CONFIG_SERIAL 1
#define CONFIG_SERIAL_HAS_DRIVER 1
#define CONFIG_SERIAL_SUPPORT_ASYNC 1
#define CONFIG_SERIAL_SUPPORT_INTERRUPT 1
#define CONFIG_UART_INTERRUPT_DRIVEN 1
#define CONFIG_UART_NRFX 1
#define CONFIG_UART_0_NRF_UARTE 1
#define CONFIG_UART_0_INTERRUPT_DRIVEN 1
#define CONFIG_UART_0_NRF_TX_BUFFER_SIZE 32
#define CONFIG_NRF_UARTE_PERIPHERAL 1
#define CONFIG_SYSTEM_CLOCK_INIT_PRIORITY 0
#define CONFIG_TICKLESS_CAPABLE 1
#define CONFIG_ENTROPY_GENERATOR 1
#define CONFIG_ENTROPY_NAME "ENTROPY_0"
#define CONFIG_GPIO_NRFX 1
#define CONFIG_GPIO_NRF_INIT_PRIORITY 40
#define CONFIG_GPIO_NRF_P0 1
#define CONFIG_CLOCK_CONTROL_NRF 1
#define CONFIG_STDOUT_CONSOLE 1
#define CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE 0
#define CONFIG_POSIX_MAX_FDS 4
#define CONFIG_PRINTK 1
#define CONFIG_EARLY_CONSOLE 1
#define CONFIG_HAS_SEGGER_RTT 1
#define CONFIG_NET_BUF 1
#define CONFIG_NET_BUF_USER_DATA_SIZE 4
#define CONFIG_NETWORKING 1
#define CONFIG_NET_INIT_PRIO 90
#define CONFIG_NET_TC_TX_COUNT 1
#define CONFIG_NET_TC_RX_COUNT 1
#define CONFIG_NET_TC_MAPPING_STRICT 1
#define CONFIG_NET_TX_DEFAULT_PRIORITY 1
#define CONFIG_NET_IP_ADDR_CHECK 1
#define CONFIG_NET_MAX_ROUTERS 1
#define CONFIG_NET_MAX_CONTEXTS 6
#define CONFIG_NET_CONTEXT_SYNC_RECV 1
#define CONFIG_NET_CONTEXT_CHECK 1
#define CONFIG_NET_PKT_RX_COUNT 4
#define CONFIG_NET_PKT_TX_COUNT 4
#define CONFIG_NET_BUF_RX_COUNT 16
#define CONFIG_NET_BUF_TX_COUNT 16
#define CONFIG_NET_BUF_FIXED_DATA_SIZE 1
#define CONFIG_NET_BUF_DATA_SIZE 128
#define CONFIG_NET_DEFAULT_IF_FIRST 1
#define CONFIG_NET_TX_STACK_SIZE 1200
#define CONFIG_NET_RX_STACK_SIZE 1500
#define CONFIG_NET_OFFLOAD 1
#define CONFIG_NET_OFFLOAD_LOG_LEVEL 0
#define CONFIG_NET_PKT_LOG_LEVEL 0
#define CONFIG_NET_DEBUG_NET_PKT_EXTERNALS 0
#define CONFIG_NET_CORE_LOG_LEVEL 0
#define CONFIG_NET_IF_LOG_LEVEL 0
#define CONFIG_NET_TC_LOG_LEVEL 0
#define CONFIG_NET_UTILS_LOG_LEVEL 0
#define CONFIG_NET_CONTEXT_LOG_LEVEL 0
#define CONFIG_NET_CONN_LOG_LEVEL 0
#define CONFIG_NET_ROUTE_LOG_LEVEL 0
#define CONFIG_MQTT_LIB 1
#define CONFIG_MQTT_LOG_LEVEL 0
#define CONFIG_NET_CONFIG_AUTO_INIT 1
#define CONFIG_NET_CONFIG_INIT_PRIO 95
#define CONFIG_NET_CONFIG_INIT_TIMEOUT 30
#define CONFIG_NET_CONFIG_LOG_LEVEL 0
#define CONFIG_NET_SOCKETS 1
#define CONFIG_NET_SOCKETS_POSIX_NAMES 1
#define CONFIG_NET_SOCKETS_POLL_MAX 3
#define CONFIG_NET_SOCKETS_CONNECT_TIMEOUT 3000
#define CONFIG_NET_SOCKETS_OFFLOAD 1
#define CONFIG_NET_SOCKETS_LOG_LEVEL 0
#define CONFIG_TEST_RANDOM_GENERATOR 1
#define CONFIG_TIMER_RANDOM_GENERATOR 1
#define CONFIG_TEST_EXTRA_STACKSIZE 0
#define CONFIG_TEST_ARM_CORTEX_M 1
#define CONFIG_HAS_CMSIS 1
#define CONFIG_LINKER_ORPHAN_SECTION_WARN 1
#define CONFIG_HAS_FLASH_LOAD_OFFSET 1
#define CONFIG_KERNEL_ENTRY "__start"
#define CONFIG_LINKER_SORT_BY_ALIGNMENT 1
#define CONFIG_SIZE_OPTIMIZATIONS 1
#define CONFIG_COMPILER_OPT ""
#define CONFIG_KERNEL_BIN_NAME "zephyr"
#define CONFIG_OUTPUT_STAT 1
#define CONFIG_OUTPUT_DISASSEMBLY 1
#define CONFIG_OUTPUT_PRINT_MEMORY_USAGE 1
#define CONFIG_BUILD_OUTPUT_BIN 1
#define CONFIG_COMPAT_INCLUDES 1

OUTPUT:

***** Booting Zephyr OS build v1.14.99-ncs3-snapshot2-2074-ga2c36f15843f *****
Flash region            Domain          Permissions
00 0x00000 0x08000      Secure          rwxl
01 0x08000 0x10000      Non-Secure      rwxl
02 0x10000 0x18000      Non-Secure      rwxl
03 0x18000 0x20000      Non-Secure      rwxl
04 0x20000 0x28000      Non-Secure      rwxl
05 0x28000 0x30000      Non-Secure      rwxl
06 0x30000 0x38000      Non-Secure      rwxl
07 0x38000 0x40000      Non-Secure      rwxl
08 0x40000 0x48000      Non-Secure      rwxl
09 0x48000 0x50000      Non-Secure      rwxl
10 0x50000 0x58000      Non-Secure      rwxl
11 0x58000 0x60000      Non-Secure      rwxl
12 0x60000 0x68000      Non-Secure      rwxl
13 0x68000 0x70000      Non-Secure      rwxl
14 0x70000 0x78000      Non-Secure      rwxl
15 0x78000 0x80000      Non-Secure      rwxl
16 0x80000 0x88000      Non-Secure      rwxl
17 0x88000 0x90000      Non-Secure      rwxl
18 0x90000 0x98000      Non-Secure      rwxl
19 0x98000 0xa0000      Non-Secure      rwxl
20 0xa0000 0xa8000      Non-Secure      rwxl
21 0xa8000 0xb0000      Non-Secure      rwxl
22 0xb0000 0xb8000      Non-Secure      rwxl
23 0xb8000 0xc0000      Non-Secure      rwxl
24 0xc0000 0xc8000      Non-Secure      rwxl
25 0xc8000 0xd0000      Non-Secure      rwxl
26 0xd0000 0xd8000      Non-Secure      rwxl
27 0xd8000 0xe0000      Non-Secure      rwxl
28 0xe0000 0xe8000      Non-Secure      rwxl
29 0xe8000 0xf0000      Non-Secure      rwxl
30 0xf0000 0xf8000      Non-Secure      rwxl
31 0xf8000 0x100000     Non-Secure      rwxl
Non-secure callable region 0 placed in flash region 0 with size 32.


SRAM region             Domain          Permissions
00 0x00000 0x02000      Secure          rwxl
01 0x02000 0x04000      Secure          rwxl
02 0x04000 0x06000      Secure          rwxl
03 0x06000 0x08000      Secure          rwxl
04 0x08000 0x0a000      Secure          rwxl
05 0x0a000 0x0c000      Secure          rwxl
06 0x0c000 0x0e000      Secure          rwxl
07 0x0e000 0x10000      Secure          rwxl
08 0x10000 0x12000      Non-Secure      rwxl
09 0x12000 0x14000      Non-Secure      rwxl
10 0x14000 0x16000      Non-Secure      rwxl
11 0x16000 0x18000      Non-Secure      rwxl
12 0x18000 0x1a000      Non-Secure      rwxl
13 0x1a000 0x1c000      Non-Secure      rwxl
14 0x1c000 0x1e000      Non-Secure      rwxl
15 0x1e000 0x20000      Non-Secure      rwxl
16 0x20000 0x22000      Non-Secure      rwxl
17 0x22000 0x24000      Non-Secure      rwxl
18 0x24000 0x26000      Non-Secure      rwxl
19 0x26000 0x28000      Non-Secure      rwxl
20 0x28000 0x2a000      Non-Secure      rwxl
21 0x2a000 0x2c000      Non-Secure      rwxl
22 0x2c000 0x2e000      Non-Secure      rwxl
23 0x2e000 0x30000      Non-Secure      rwxl
24 0x30000 0x32000      Non-Secure      rwxl
25 0x32000 0x34000      Non-Secure      rwxl
26 0x34000 0x36000      Non-Secure      rwxl
27 0x36000 0x38000      Non-Secure      rwxl
28 0x38000 0x3a000      Non-Secure      rwxl
29 0x3a000 0x3c000      Non-Secure      rwxl
30 0x3c000 0x3e000      Non-Secure      rwxl
31 0x3e000 0x40000      Non-Secure      rwxl

Peripheral              Domain          Status
00 NRF_P0               Non-Secure      OK
01 NRF_CLOCK            Non-Secure      OK
02 NRF_RTC1             Non-Secure      OK
03 NRF_NVMC             Non-Secure      OK
04 NRF_UARTE1           Non-Secure      OK
05 NRF_UARTE2           Secure          SKIP
06 NRF_TWIM2            Non-Secure      OK
07 NRF_SPIM3            Non-Secure      OK
08 NRF_TIMER0           Non-Secure      OK
09 NRF_TIMER1           Non-Secure      OK
10 NRF_TIMER2           Non-Secure      OK
11 NRF_SAADC            Non-Secure      OK
12 NRF_PWM0             Non-Secure      OK
13 NRF_PWM1             Non-Secure      OK
14 NRF_PWM2             Non-Secure      OK
15 NRF_PWM3             Non-Secure      OK
16 NRF_WDT              Secure          SKIP
17 NRF_IPC              Non-Secure      OK
18 NRF_VMC              Non-Secure      OK
19 NRF_FPU              Non-Secure      OK
20 NRF_EGU1             Non-Secure      OK
21 NRF_EGU2             Non-Secure      OK
22 NRF_GPIOTE1          Non-Secure      OK
23 NRF_REGULATORS       Secure          SKIP

SPM: NS image at 0xc000
SPM: NS MSP at 0x20025b98
SPM: NS reset vector at 0xe899
SPM: prepare to jump to Non-Secure image.
***** Booting Zephyr OS build v1.14.99-ncs3-snapshot2-2074-ga2c36f15843f *****
The MQTT simple sample started
Write ca certs sec_tag: 16842753
FATAL: Exception occurred in Secure State
FATAL: ***** HARD FAULT *****
FATAL:   Fault escalation (see below)
FATAL: ***** BUS FAULT *****
FATAL:   Precise data bus error
FATAL:   BFAR Address: 0x50008120
FATAL: r0/a1:  0x00000000  r1/a2:  0x00000000  r2/a3:  0x00000000
FATAL: r3/a4:  0x00000000 r12/ip:  0x00000000 r14/lr:  0x00000000
FATAL:  xpsr:  0x00000000
FATAL: s[0]:  0x00000000  s[1]:  0x00000000  s[2]:  0x00000000  s[3]:  0x00000000

FATAL: s[4]:  0x00000000  s[5]:  0x00000000  s[6]:  0x00000000  s[7]:  0x00000000

FATAL: s[8]:  0x00000000  s[9]:  0x00000000  s[10]:  0x00000000  s[11]:  0x00000000

FATAL: s[12]:  0x00000000  s[13]:  0x00000000  s[14]:  0x00000000  s[15]:  0x00000000

FATAL: fpscr:  0x00000000

FATAL: Faulting instruction address (r15/pc): 0x00000000
FATAL: >>> ZEPHYR FATAL ERROR 0: CPU exception
FATAL: Current thread: 0x2002032c (unknown)
FATAL: Halting system

Any idea?

Best regards,

Julien

  • Hi.

    While I have not tried to run your code yet, I cannot see anything that looks wrong. However, one thing I noticed in your log is that you do not print "Deleting certs sec_tag: %d\n". Is there a reason for these five lines missing from the log?

    In general, we do not recommend writing certificates from the application. This has several downsides:

    The certificates are present in the flash, they will be present in modem traces, and writing the certificates on every reboot leads to rapid flash wear.

    Instead, what we recommend is that you use the "Certificate Manager" in the LTE Link Monitor application in nRF Connect for Desktop, using the at_client (with increased buffers) on the nRF9160.

    This way, you only write the certificates when you need to, they are not stored easily accessible in flash, and will not show up in modem traces (unless you take a trace of the certificate writing).

    You should also consider using another sec_tag, as the nrf_cloud library uses 16842753. This means that if you delete or write new certificates to that sec_tag, you will not be able to connect to nRF Cloud without getting new certificates (guide here: https://devzone.nordicsemi.com/nordic/cellular-iot-guides/b/getting-started-cellular/posts/nrf-cloud-certificate-update).

    Also, if you want to connect to mqtt.eclipse.org with TLS, you must use port 8883, not 1883.

    Finally, NB-IoT is not well suited for TCP traffic. Instead of using MQTT, which relies on TCP. You might want to take a look at UDP based protocols with STLS for security.

    Best regards,

    Didrik

  • Hi Didrik,

    Thank you very much for your rapid answer.

    As I tried several codes, with and without key deletion, I may have copied the wrong log. Sorry for that.

    I saw the "Certificate Manager" in the LTE Link Monitor. If I understand it correctly, this manager requires JSON formats for certificates. The CA certificate I own was generated by openssl and has a CRT/PEM format. I put it in a defined string in the certificates.h file. How can I convert it in a format accepted by the "Certificate Manager"  so that I can at least try this tool?

    I am well aware of the flash wearing problematic. My code is just a proof of concept. I want to master both ways of writing certificates.

    You'll see in autoconf.h that the port 8883 is used, not 1883.

    Thank you for your advice regarding NB-IoT and TCP. Once I manage to make my application MQTT+TLS work, I'll take a look at UDP based protocol.

    Will you nevertheless try my code to  help finding the problem? 

    Best regards,

    Julien

  • Julien said:
    You'll see in autoconf.h that the port 8883 is used, not 1883.

     I see now that the offending line in your prj.conf is commented out. Sorry for the confusion.

    When getting new certificates from nRF Cloud, these certificates come in JSON format (client ID, private key, public key, CA certificate). For simplicity, the Certificate Manager can import the certificates directly from this JSON file. However, the certificates themselves are PEM formatted, and you should be able to copy a PEM formatted key/certificate into the corresponding text box.

    Again, note that you probably have to increase the buffer size in the at_client sample by setting CONFIG_AT_CMD_RESPONSE_MAX_LEN (3000 should be more than enough).

    One tip for reducing the problem with writing certificates from the application is to only do it when you want to update the certificates, so set CONFIG_PROVISION_CERTIFICATES to "n" after successfully writing certificates.

    I'll try your code to see if I can reproduce your problem.

  • Hi.

    Can you check what commit you are on in the nrf repo (and run "west update" afterward)?

    I tried running your code (had to make a couple of changes to make it compile, but nothing big). Instead of an exception, it just hanged at nrf_inbuilt_key_delete.

    I tried removing and disabling the modem_info module, and then everything worked as expected.

    Best regards,

    Didrik

  • Thank you. I managed to establish the secure connection using the provision function in the code and the CA certificate in the certificates.h file.

    Nevertheless, I just made a small check that let me doubt about the setup. I "corrupted" the content of the CA certificate in the certificates.h file, cleaned the solution, rebuilt and reprogram the nRF. The connection nevertheless established and so I wonder if the nRF really validates the server certificate sent by the certificate during the TLS connection establishment.

    Is the verification of the server certificate by the client done only of the CA certificate stored in the modem is valid? 

    Any idea?

    Best regards,

    Julien

Related