Jump to content

    
Sign in to follow this  
roma-cezar

STM32F4 freertos + lwip + mqtt + mbedtls

Recommended Posts

Всем привет. Запустил mqtt из стека LWIP для STM32. Все работает. Но как сделать чтоб работало через TLS. Кто то может делал, поделитесь информацией?

В кубе подключил mbedtls по дефолту ибо хз что там настраивать конкретно, так же в настройках lwip включил опции LWIP_ALTCP & LWIP_ALTCP_TLS, добавил в PATH LWIP_ALTCP_TLS_MBEDTLS

Долго не мог понять, куда нужно сунуть сертификат. Посмотрел я еще исходники и сравнил с ALTCP Config, понял, что в структуру передается еще структура с сертификатом . Из-за чего-то свойство tls_config не виделось при вызове структуры ci, хотя все нужные дефайны есть
В итоге пока инициализация выглядит так:

struct mqtt_connect_client_info_t ci;
memset(&ci, 0, sizeof(ci));
ci.client_id = "lwip_test";
ci.client_user = "";
ci.client_pass = "";
ci.keep_alive = 0;
ci.tls_config = altcp_tls_create_config_client((const u8_t*)test_cert, sizeof(test_cert));
// create client
client = mqtt_client_new();
// connect client   
mqtt_client_connect(client, &resolved, port, mqtt_on_connect, (void *)0, &ci);

Настроил mqtt сервер москито, создал сертификаты, проверил, что работает.

Однако проект не соединяется, все время вылетает в функции altcp_tls_create_config_client_common (altcp_tls_mbedtls.c)

ret = mbedtls_x509_crt_parse(conf->ca, ca, ca_len);
if (ret != 0) 
{
      LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse ca failed: %d 0x%x", ret, -1*ret));
      altcp_mbedtls_free_config(conf);
      return NULL;
}

ret = -4480 , Failed to allocate memory.
Может я еще что-то упускаю?

Edited by roma-cezar

Share this post


Link to post
Share on other sites

Если еще актуально, попробуйте увеличить значение #define MEM_SIZE 1024*40 в файле LWIP lwipopts.h. Для работы мбедтлс требуется 2 буфера по 16кб памяти и еще под другие нужды она тоже нужна, как минимум под прием\отправку пакетов и сам сертификат(после парсинга)

Share this post


Link to post
Share on other sites
10 hours ago, Neo_Matrix said:

Если еще актуально, попробуйте увеличить значение #define MEM_SIZE 1024*40 в файле LWIP lwipopts.h. Для работы мбедтлс требуется 2 буфера по 16кб памяти и еще под другие нужды она тоже нужна, как минимум под прием\отправку пакетов и сам сертификат(после парсинга)

Спасибо, сегодня попробую

UPD К сожалению не помогло.

Может кто сможет поглядеть проект (CubeIde) http://rapid.ufanet.ru/80234650

Так же отдельно прикреплю настроки LWIP и MBEDTLS

mbedtls_config.h

lwipopts.h

Edited by roma-cezar

Share this post


Link to post
Share on other sites

Щас еще заметил ,что в файле altcp_tls_mbedtls.c есть указание:

 * Mandatory security-related configuration:
 * - define ALTCP_MBEDTLS_RNG_FN to mbedtls_entropy_func to use the standard mbedTLS
 *   entropy and ensure to add at least one strong entropy source to your mbedtls port
 *   (implement mbedtls_platform_entropy_poll or mbedtls_hardware_poll providing strong
 *   entropy)
 * - define ALTCP_MBEDTLS_ENTROPY_PTR and ALTCP_MBEDTLS_ENTROPY_LEN to something providing
 *   GOOD custom entropy

и соответствующие дефайны:

#ifndef ALTCP_MBEDTLS_ENTROPY_PTR
#define ALTCP_MBEDTLS_ENTROPY_PTR   NULL
#endif
#ifndef ALTCP_MBEDTLS_ENTROPY_LEN
#define ALTCP_MBEDTLS_ENTROPY_LEN   0
#endif

Но вот что объявлять то они должны? Ниче не находится в гугле даже

Так же похоже необходимо подключать некоторые модули mbedtls судя по файлу altcp_tls_mbedtls_mem.c 

#ifndef ALTCP_MBEDTLS_MEM_DEBUG
#define ALTCP_MBEDTLS_MEM_DEBUG   LWIP_DBG_OFF
#endif

#if defined(MBEDTLS_PLATFORM_MEMORY) && \
   (!defined(MBEDTLS_PLATFORM_FREE_MACRO) || \
    defined(MBEDTLS_PLATFORM_CALLOC_MACRO))
#define ALTCP_MBEDTLS_PLATFORM_ALLOC 1
#else
#define ALTCP_MBEDTLS_PLATFORM_ALLOC 0
#endif

#if ALTCP_MBEDTLS_PLATFORM_ALLOC

#ifndef ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS
#define ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS 0
#endif

Пробовал, но либо ошибки дает при компиляции либо все то же самое. В общем ничего не понятно.

Share this post


Link to post
Share on other sites

 

В 09.04.2020 в 18:40, roma-cezar сказал:

 все время вылетает в функции altcp_tls_create_config_client_common (altcp_tls_mbedtls.c)

ret = -4480 , Failed to allocate memory.
Может я еще что-то упускаю?

 

У Вас есть конкретная ошибка, вот и решайте проблемы с выделением памяти в куче, зачем сейчас разбираться с энтропией. Для теста можете написать простую функцию энтропии, которая в цикле заполняет массив константами, после перепишите под аппаратный RNG.

Функции выделения памяти

MBEDTLS_PLATFORM_CALLOC_MACRO
MBEDTLS_PLATFORM_FREE_MACRO

по скольку я помню Вы должны переопределить сами.

Если используете ФриРТОС, это будет vPortFree и нужно написать врапер над pvPortMalloc для calloc.

 

Что то вроде этого:

void *pvPortCalloc(size_t nmemb, size_t size) {
	void *x = pvPortMalloc(nmemb * size);
	if (x != NULL) {
		memset(x, 0, nmemb * size);
	}
	return x;
}

 

Edited by Neo_Matrix

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this