[PolarSSL+FreeRTOS]"bad message length" & "malloc failed" Error 해결 방법

2016. 12. 1. 12:572018년 이전 관심사/개발관련

반응형

PolarSSL “bad message length” & “malloc failed” Error 해결 방법

Environment

  • SSL : PolarSSL-1.3.8
  • RTOS : FreeRTOS-8.1.2
  • Network Stack : Lwip-1.4.1
  • MCU : RealTek RTL8195a

문제

Wi-Fi 모듈에서 SKT ThingPlug에 SSL 연결을 위한 기능을 구현 하는 중, SSL 연결이 되지 않는 문제가 발생 하였다.

원인 분석

정확한 원인을 분석하기 위하여 Wi-Fi 모듈과 ThingPlug 간에 주고 받는 패킷을 캡쳐 하였다. 패킷 분석 결과, SSL 서버와 Hand Shake 과정이 정상적으로 완료 되지 않는 것을 확인 하였다.

20161201_103207

SKT ThingPlug Server와 정상적인 통신 패킷을 확인 해 보기 위해, PC에서 SSL 연결을 시도 해 보았다.
연결이 성공 하는 경우, 아래 그림과 같이 Client Hello -> Server Hello 이후 SSL 서버가 Certificate를 송신하는 과정을 볼 수 있다.

20161201_104837

Certificate 과정의 패킷을 보면, 4개의 인증서를 송신하는 것을 볼 수 있다. 인증서는 1개의 sktiot.com 인증서와 sktiot.com의 신뢰성을 보장해 주는 상위 기관 인증서 3개를 송신 한다.

20161201_110219

20161201_105209

위의 4개의 인증서를 수신하기 위해서는 5410bytes 이상의 메모리가 필요 할 것으로 보이며, 위에서 발생한 “bad message length” 에러도 Wi-Fi 모듈에서 SSL 인증서를 처리 하기 위한 메모리가 부족하거나 설정이 작은 값으로 되어 있는 것으로 판단 된다.

문제 해결

“bad message length” Error

Wi-Fi 모듈에서 에러를 출력하는 부분을 확인해 보면, 아래와 같이 수신된 ssl message length가 SSL_MAX_CONTENT_LEN 값 보다 크면 해당 에러를 출력하는 코드를 볼 수 있다. 현재 SSL_MAX_CONTENT_LEN 값이 4096으로 되어 있어서 그보다 더 큰 Contents를 수신하지 못 했던 것으로 판단 되며, 값을 6144( 6Kbytes )로 수정 하였다.

if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
{
    SSL_DEBUG_MSG( 1, ( "bad message length" ) );
    return( POLARSSL_ERR_SSL_INVALID_RECORD );
}

“malloc failed” Error

SSL_MAX_CONTENT_LEN 값을 수정 하고 테스트 해 보니, 이번에는 malloc failed 에러가 발생 하였다.

위는 Heap 메모리가 부족해서 출력된 에러로 판단 되며, FreeRTOSConfig.h의 configTOTAL_HEAP_SIZE의 값을 (70 1024) —> ( 80 1024 )로 수정 후 정상적으로 SKT ThingPlug에 SSL 연결이 되는 것을 확인 하였다.



반응형