Simple interface for Mbed Cloud Client

Dependents:  

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers pal_tls_test.c Source File

pal_tls_test.c

00001 /*******************************************************************************
00002  * Copyright 2016, 2017 ARM Ltd.
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *     http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  *******************************************************************************/
00016 
00017 #include "unity.h"
00018 #include "unity_fixture.h"
00019 #include "pal.h"
00020 #include "pal_tls_utils.h"
00021 #include "pal_network.h"
00022 #include "stdlib.h"
00023 #include "sotp.h"
00024 #include "test_runners.h"
00025 
00026 #define TRACE_GROUP "TLS_TESTS"
00027 #define PAL_TEST_PSK_IDENTITY "Client_identity"
00028 
00029 #define PAL_TEST_PSK {0x12,0x34,0x45,0x67,0x89,0x10}
00030 
00031 
00032 PAL_PRIVATE palSocket_t g_socket = 0;
00033 extern void * g_palTestTLSInterfaceCTX; // this is set by the palTestMain funciton
00034 PAL_PRIVATE uint32_t g_interfaceCTXIndex = 0;
00035 
00036 #if ((PAL_USE_SECURE_TIME == 1) && (PAL_USE_INTERNAL_FLASH == 1))
00037     PAL_PRIVATE uint8_t g_trustedServerID[PAL_CERT_ID_SIZE] __attribute__((aligned(4))) = { 0 };
00038     PAL_PRIVATE size_t g_actualServerIDSize = 0;
00039 #endif 
00040 
00041 PAL_PRIVATE palMutexID_t g_mutex1 = NULLPTR;
00042 PAL_PRIVATE palMutexID_t g_mutex2 = NULLPTR;
00043 PAL_PRIVATE palMutexID_t g_mutexHandShake1 = NULLPTR;
00044 PAL_PRIVATE bool g_retryHandshake = false;
00045 PAL_PRIVATE const uint8_t g_coapHelloWorldRequest[16] = { 0x50,0x01,0x57,0x3e,0xff,0x2f,0x68,0x65,0x6c,0x6c,0x6f,0x57,0x6f,0x72,0x6c,0x64 };
00046 
00047 #define PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(a, b) \
00048     if (a != b) \
00049     {\
00050         PAL_LOG(ERR,"Expected: %" PRId32 " , Actual: %" PRId32 " , Line: %d\n", (int32_t)a, (int32_t)b, __LINE__);\
00051         goto finish;\
00052     }
00053 
00054 
00055 //! This structre is for tests only and MUST be the same structure as in the pal_TLS.c file
00056 //! For any change done in the original structure, please make sure to change this structure too.
00057 typedef struct palTLSService
00058 {
00059     bool retryHandShake;
00060     uint64_t serverTime;
00061     palTLSHandle_t platTlsHandle;
00062 }palTLSTest_t;
00063 
00064 TEST_GROUP(pal_tls);
00065 
00066 TEST_SETUP(pal_tls)
00067 {
00068     palStatus_t status = PAL_SUCCESS;
00069     uint64_t currentTime = 1504893346; //GMT: Friday, September 8, 2017 5:55:46 PM
00070 
00071     pal_init();
00072 
00073     if (g_palTestTLSInterfaceCTX == NULL)
00074     {
00075         PAL_LOG(ERR, "error: net interface not configutred correctly");
00076     }
00077     else
00078     {
00079         status = pal_registerNetworkInterface(g_palTestTLSInterfaceCTX, &g_interfaceCTXIndex);
00080         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00081     }
00082 
00083     g_socket = 0;
00084 
00085     status = pal_osSetTime(currentTime);
00086     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00087 
00088 }
00089 
00090 TEST_TEAR_DOWN(pal_tls)
00091 {
00092     sotp_result_e sotpRes = SOTP_SUCCESS;
00093     if (0 != g_socket)
00094     {
00095         pal_close(&g_socket);
00096     }
00097 
00098     sotpRes = sotp_delete(SOTP_TYPE_TRUSTED_TIME_SRV_ID);
00099     TEST_ASSERT_TRUE((SOTP_SUCCESS == sotpRes) || (SOTP_NOT_FOUND == sotpRes));
00100     
00101     pal_destroy();
00102 }
00103 
00104 /**
00105 * @brief Test TLS cofiguration initialization and uninitialization.
00106 *
00107 *
00108 * | # |    Step                        |   Expected  |
00109 * |---|--------------------------------|-------------|
00110 * | 1 | Initialize TLS configuration using `pal_initTLSConfiguration`.       | PAL_SUCCESS |
00111 * | 2 | Uninitialize TLS configuration using `pal_tlsConfigurationFree`.     | PAL_SUCCESS |
00112 */
00113 TEST(pal_tls, tlsConfiguration)
00114 {
00115     palStatus_t status = PAL_SUCCESS;
00116     palTLSConfHandle_t palTLSConf = NULLPTR;
00117     palTLSTransportMode_t transportationMode =     PAL_TLS_MODE;
00118     /*#1*/
00119     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
00120     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00121     TEST_ASSERT_TRUE(NULLPTR != palTLSConf);
00122     /*#2*/
00123     status = pal_tlsConfigurationFree(&palTLSConf);
00124     TEST_ASSERT_EQUAL_HEX(NULLPTR, palTLSConf);
00125     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00126 }
00127 
00128 int palTestEntropySource(void *data, unsigned char *output, size_t len, size_t *olen)
00129 {
00130     palStatus_t status = PAL_SUCCESS;
00131     (void)data;
00132 
00133     status = pal_osRandomBuffer(output, len);
00134     if (PAL_SUCCESS == status)
00135     {
00136         *olen = len;
00137     }
00138     else
00139     {
00140         return -1;
00141     }
00142     return 0;
00143 }
00144 
00145 static void handshakeUDP(bool socketNonBlocking)
00146 {
00147     palStatus_t status = PAL_SUCCESS;
00148     palTLSConfHandle_t palTLSConf = NULLPTR;
00149     palTLSHandle_t palTLSHandle = NULLPTR;
00150     palTLSTransportMode_t transportationMode =     PAL_DTLS_MODE;
00151     palSocketAddress_t socketAddr = {0};
00152     palSocketLength_t addressLength = 0;
00153     char serverResponse[PAL_TLS_MESSAGE_SIZE] = {0};
00154     uint32_t actualLen = 0;
00155     uint32_t written = 0;
00156     #if (PAL_ENABLE_X509 == 1)
00157         palX509_t pubKey = {(const void*)g_pubKey,sizeof(g_pubKey)};
00158         palPrivateKey_t prvKey = {(const void*)g_prvKey,sizeof(g_prvKey)};
00159         palX509_t caCert = { (const void*)pal_test_cas,sizeof(pal_test_cas) };
00160     #elif (PAL_ENABLE_PSK == 1)
00161         const char* identity = PAL_TEST_PSK_IDENTITY;
00162         const char psk[]= PAL_TEST_PSK;
00163     #endif
00164     palTLSSocket_t tlsSocket = {g_socket, &socketAddr, 0, transportationMode};
00165     int32_t verifyResult = 0;
00166 
00167     /*#1*/
00168     status = pal_socket(PAL_AF_INET, PAL_SOCK_DGRAM , socketNonBlocking, 0, &g_socket);
00169     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00170     /*#2*/
00171     status = pal_getAddressInfo(PAL_TLS_TEST_SERVER_ADDRESS, &socketAddr, &addressLength);
00172     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00173 
00174     tlsSocket.addressLength = addressLength;
00175     tlsSocket.socket = g_socket;
00176     /*#3*/
00177     status = pal_setSockAddrPort(&socketAddr, DTLS_SERVER_PORT);
00178     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00179     /*#4*/
00180     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
00181     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00182     /*#5*/
00183     status = pal_initTLS(palTLSConf, &palTLSHandle);
00184     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00185 
00186     // This code commented out to prevent massive prints from mbedTLS, if you want to see logs from client side, just uncomment them.
00187     //status = pal_sslDebugging(true);
00188     //TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00189     #if (PAL_ENABLE_X509 == 1)
00190         /*#6*/
00191         status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
00192         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00193         /*#7*/
00194         status = pal_setCAChain(palTLSConf, &caCert, NULL);
00195         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00196     #elif (PAL_ENABLE_PSK == 1)
00197         /*#6 + #7*/
00198         status = pal_setPSK(palTLSConf, (const unsigned char*)identity, strlen(identity), (const unsigned char*)psk, sizeof(psk));
00199         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00200     #endif
00201     /*#8*/
00202     status = pal_tlsSetSocket(palTLSConf, &tlsSocket);
00203     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00204     /*#9*/
00205 
00206     status = pal_setHandShakeTimeOut(palTLSConf, 30000);
00207     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00208     /*#10*/
00209 
00210     do
00211     {
00212         status = pal_handShake(palTLSHandle, palTLSConf);
00213     }
00214     while (PAL_ERR_TLS_WANT_READ == status || PAL_ERR_TLS_WANT_WRITE == status);
00215     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00216 
00217     /*#11*/
00218     status = pal_sslGetVerifyResultExtended(palTLSHandle, &verifyResult);
00219     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00220     /*#12*/
00221     status = pal_sslWrite(palTLSHandle, g_coapHelloWorldRequest, sizeof(g_coapHelloWorldRequest), &written);
00222     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00223     /*#13*/
00224     pal_osDelay(5000);
00225     /*#14*/
00226     do
00227     {
00228         status = pal_sslRead(palTLSHandle, serverResponse, PAL_TLS_MESSAGE_SIZE, &actualLen);
00229     }while (PAL_ERR_TLS_WANT_READ == status);
00230     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00231 
00232     /*#15*/
00233     status = pal_freeTLS(&palTLSHandle);
00234     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00235     /*#16*/
00236     status = pal_tlsConfigurationFree(&palTLSConf);
00237     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00238     /*#17*/
00239     status = pal_close(&g_socket);
00240     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00241 }
00242 
00243 
00244 static void handshakeTCP(bool socketNonBlocking)
00245 {
00246     palStatus_t status = PAL_SUCCESS;
00247     palTLSConfHandle_t palTLSConf = NULLPTR;
00248     palTLSHandle_t palTLSHandle = NULLPTR;
00249     palTLSTransportMode_t transportationMode =     PAL_TLS_MODE;
00250     palSocketAddress_t socketAddr = {0};
00251     palSocketLength_t addressLength = 0;
00252     char serverResponse[PAL_TLS_MESSAGE_SIZE] = {0};
00253     uint32_t actualLen = 0;
00254     uint32_t written = 0;
00255     #if (PAL_ENABLE_X509 == 1)
00256         palX509_t pubKey = {(const void*)g_pubKey,sizeof(g_pubKey)};
00257         palPrivateKey_t prvKey = {(const void*)g_prvKey,sizeof(g_prvKey)};
00258         palX509_t caCert = { (const void*)pal_test_cas,sizeof(pal_test_cas) };
00259     #elif (PAL_ENABLE_PSK == 1)
00260         const char* identity = PAL_TEST_PSK_IDENTITY;
00261         const char psk[]= PAL_TEST_PSK;
00262     #endif
00263     palTLSSocket_t tlsSocket = { g_socket, &socketAddr, 0, transportationMode };    
00264     uint64_t curTimeInSec, timePassedInSec;
00265     const uint64_t minSecSinceEpoch = PAL_MIN_SEC_FROM_EPOCH + 1; //At least 47 years passed from 1.1.1970 in seconds
00266     int32_t verifyResult = 0;
00267     
00268 
00269     /*#1*/
00270     status = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, socketNonBlocking, 0, &g_socket);
00271     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00272     /*#2*/
00273     status = pal_getAddressInfo(PAL_TLS_TEST_SERVER_ADDRESS, &socketAddr, &addressLength);
00274     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00275 
00276     tlsSocket.addressLength = addressLength;
00277     tlsSocket.socket = g_socket;
00278     /*#3*/
00279     if (true == socketNonBlocking)
00280     {
00281         status = pal_setSockAddrPort(&socketAddr, TLS_SERVER_PORT_NB);
00282         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00283     }
00284     else //blocking
00285     {
00286         status = pal_setSockAddrPort(&socketAddr, TLS_SERVER_PORT);
00287         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00288     }
00289 
00290     /*#4*/
00291     status = pal_connect(g_socket, &socketAddr, addressLength);
00292     if (PAL_ERR_SOCKET_IN_PROGRES  == status)
00293     {
00294         pal_osDelay(400);
00295     }
00296     else
00297     {
00298         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00299     }
00300     /*#5*/
00301     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
00302     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00303     TEST_ASSERT_NOT_EQUAL(palTLSConf, NULLPTR);
00304     /*#6*/
00305     status = pal_initTLS(palTLSConf, &palTLSHandle);
00306     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00307 
00308     // This code commented out to prevent massive prints from mbedTLS, if you want to see logs from client side, just uncomment them.
00309     //status = pal_sslDebugging(true);
00310     //TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00311     #if (PAL_ENABLE_X509 == 1)
00312         /*#7*/    
00313         status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
00314         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00315         /*#8*/
00316         status = pal_setCAChain(palTLSConf, &caCert, NULL);
00317         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00318     #elif (PAL_ENABLE_PSK == 1)
00319         /*#7 + 8*/
00320         status = pal_setPSK(palTLSConf, (const unsigned char*)identity, strlen(identity), (const unsigned char*)psk, sizeof(psk));
00321         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00322     #endif
00323     /*#9*/
00324     status = pal_tlsSetSocket(palTLSConf, &tlsSocket);
00325     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00326     /*#10*/
00327     if (true == socketNonBlocking)
00328     {
00329         status = pal_osSetTime(minSecSinceEpoch);
00330         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status); // More than current epoch time -> success
00331         do
00332         {
00333             curTimeInSec = pal_osGetTime();
00334             TEST_ASSERT_TRUE(curTimeInSec >= minSecSinceEpoch);        
00335             timePassedInSec = curTimeInSec - minSecSinceEpoch;
00336             status = pal_handShake(palTLSHandle, palTLSConf);
00337         }
00338         while ( (PAL_ERR_TLS_WANT_READ == status || PAL_ERR_TLS_WANT_WRITE == status) &&
00339                 (timePassedInSec < PAL_SECONDS_PER_MIN)); //2 minutes to wait for handshake
00340     }
00341     else //blocking
00342     {
00343         status = pal_handShake(palTLSHandle, palTLSConf);
00344     }
00345     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00346 
00347     /*#11*/
00348     status = pal_sslGetVerifyResultExtended(palTLSHandle, &verifyResult);
00349     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00350     /*#12*/
00351     status = pal_sslWrite(palTLSHandle, TLS_GET_REQUEST, sizeof(TLS_GET_REQUEST), &written);
00352     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00353     /*#13*/
00354     pal_osDelay(5000);
00355     /*#14*/
00356     status = pal_sslRead(palTLSHandle, serverResponse, PAL_TLS_MESSAGE_SIZE, &actualLen);
00357     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00358 
00359     /*#15*/
00360     status = pal_freeTLS(&palTLSHandle);
00361     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00362     /*#16*/
00363     status = pal_tlsConfigurationFree(&palTLSConf);
00364     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00365     /*#17*/
00366     status = pal_close(&g_socket);
00367     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00368 
00369 }
00370 
00371 /**
00372 * @brief Test TLS initialization and uninitialization.
00373 *
00374 *
00375 * | # |    Step                        |   Expected  |
00376 * |---|--------------------------------|-------------|
00377 * | 1 | Initialize TLS configuration using `pal_initTLSConfiguration`.       | PAL_SUCCESS |
00378 * | 2 | Initialize TLS context using `pal_initTLS`.                          | PAL_SUCCESS |
00379 * | 3 | Add a NULL entropy source using `pal_addEntropySource`.             | PAL_ERR_INVALID_ARGUMENT |
00380 * | 4 | Add a valid entropy source using `pal_addEntropySource`.             | PAL_SUCCESS |
00381 * | 5 | Uninitialize TLS context using `pal_freeTLS`.                        | PAL_SUCCESS |
00382 * | 6 | Uninitialize TLS configuration using `pal_tlsConfigurationFree`.     | PAL_SUCCESS |
00383 */
00384 TEST(pal_tls, tlsInitTLS)
00385 {
00386     palStatus_t status = PAL_SUCCESS;
00387     palTLSConfHandle_t palTLSConf = NULLPTR;
00388     palTLSHandle_t palTLSHandle = NULLPTR;
00389     palTLSTransportMode_t transportationMode =     PAL_TLS_MODE;
00390     /*#1*/
00391     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
00392     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00393     /*#2*/
00394     status = pal_initTLS(palTLSConf, &palTLSHandle);
00395     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00396 #ifdef DEBUG
00397     /*#3*/
00398     status = pal_addEntropySource(NULL);
00399     TEST_ASSERT_EQUAL_HEX(PAL_ERR_INVALID_ARGUMENT , status);
00400 #endif
00401     /*#4*/
00402     status = pal_addEntropySource(palTestEntropySource);
00403     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00404     /*#5*/
00405     status = pal_freeTLS(&palTLSHandle);
00406     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00407     /*#6*/
00408     status = pal_tlsConfigurationFree(&palTLSConf);
00409     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00410 }
00411 
00412 
00413 /**
00414 * @brief Test TLS initialization and uninitialization with additional keys.
00415 *
00416 *
00417 * | # |    Step                        |   Expected  |
00418 * |---|--------------------------------|-------------|
00419 * | 1 | Initialize TLS configuration using `pal_initTLSConfiguration`.       | PAL_SUCCESS |
00420 * | 2 | Add keys to the configuration using `pal_setOwnCertAndPrivateKey`.           | PAL_SUCCESS |
00421 * | 3 | Initialize TLS context using `pal_initTLS`.                          | PAL_SUCCESS |
00422 * | 4 | Uninitialize TLS context using `pal_freeTLS`.                        | PAL_SUCCESS |
00423 * | 5 | Uninitialize TLS configuration using `pal_tlsConfigurationFree`.     | PAL_SUCCESS |
00424 */
00425 TEST(pal_tls, tlsPrivateAndPublicKeys)
00426 {
00427 #if (PAL_ENABLE_X509 == 1)
00428     palStatus_t status = PAL_SUCCESS;
00429     palTLSConfHandle_t palTLSConf = NULLPTR;
00430     palTLSHandle_t palTLSHandle = NULLPTR;
00431     palTLSTransportMode_t transportationMode = PAL_TLS_MODE;
00432     palX509_t pubKey = { (const void*)g_pubKey,sizeof(g_pubKey) };
00433     palPrivateKey_t prvKey = { (const void*)g_prvKey,sizeof(g_prvKey) };
00434 
00435     /*#1*/
00436     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
00437     TEST_ASSERT_NOT_EQUAL(palTLSConf, NULLPTR);
00438     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00439     /*#2*/
00440     status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
00441     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00442     /*#3*/
00443     status = pal_initTLS(palTLSConf, &palTLSHandle);
00444     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00445     /*#4*/
00446     status = pal_freeTLS(&palTLSHandle);
00447     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00448     /*#5*/
00449     status = pal_tlsConfigurationFree(&palTLSConf);
00450     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00451 #endif
00452 }
00453 
00454 
00455 /**
00456 * @brief Test TLS initialization and uninitialization with additional certificate and pre-shared keys.
00457 *
00458 *
00459 * | # |    Step                        |   Expected  |
00460 * |---|--------------------------------|-------------|
00461 * | 1 | Initialize TLS configuration using `pal_initTLSConfiguration`.       | PAL_SUCCESS |
00462 * | 2 | Set pre-shared keys to the configuration using `pal_setPSK`.         | PAL_SUCCESS |
00463 * | 3 | Initialize TLS context using `pal_initTLS`.                         | PAL_SUCCESS
00464 * | 4 | Uninitialize TLS context using `pal_freeTLS`.                        |PAL_SUCCESS |
00465 * | 5 | Uninitialize TLS configuration using `pal_tlsConfigurationFree`.     | PAL_SUCCESS |
00466 */
00467 TEST(pal_tls, tlsCACertandPSK)
00468 {
00469 #if (PAL_ENABLE_PSK == 1)
00470     palStatus_t status = PAL_SUCCESS;
00471     palTLSConfHandle_t palTLSConf = NULLPTR;
00472     palTLSHandle_t palTLSHandle = NULLPTR;
00473     palTLSTransportMode_t transportationMode = PAL_TLS_MODE;
00474     /*#1*/
00475     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
00476     TEST_ASSERT_NOT_EQUAL(palTLSConf, NULLPTR);
00477     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00478     /*#2*/
00479     status = pal_setPSK(palTLSConf, g_psk_id, sizeof(g_psk_id) - 1, g_psk, sizeof(g_psk));
00480     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00481     /*#3*/
00482     status = pal_initTLS(palTLSConf, &palTLSHandle);
00483     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00484     /*#4*/
00485     status = pal_freeTLS(&palTLSHandle);
00486     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00487     /*#5*/
00488     status = pal_tlsConfigurationFree(&palTLSConf);
00489     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00490 #endif
00491 }
00492 
00493 
00494 /**
00495 * @brief Test TLS handshake (TCP blocking).
00496 *
00497 *
00498 * | # |    Step                        |   Expected  |
00499 * |---|--------------------------------|-------------|
00500 * | 1 | Create a TCP (blocking) socket.                                        | PAL_SUCCESS |
00501 * | 2 | Perform a DNS lookup on the server address.                                | PAL_SUCCESS |
00502 * | 3 | Set the server port.                                                     | PAL_SUCCESS |
00503 * | 4 | Connect the TCP socket to the server.                                        | PAL_SUCCESS |
00504 * | 5 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
00505 * | 6 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
00506 * | 7 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
00507 * | 8 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
00508 * | 9 | Set the socket chain to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
00509 * | 10 | Perform a TLS handshake with the server using `pal_handShaket`.           | PAL_SUCCESS |
00510 * | 11 | Verify the handshake result using `pal_sslGetVerifyResult`.               | PAL_SUCCESS |
00511 * | 12 | Write data over open TLS connection using `pal_sslWrite`.            | PAL_SUCCESS |
00512 * | 13 | Wait for the response.                                                  | PAL_SUCCESS |
00513 * | 14 | Read data from the open TLS connection using `pal_sslRead`.               | PAL_SUCCESS |
00514 * | 15 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
00515 * | 16 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
00516 * | 17 | Close the TCP socket.                                                   | PAL_SUCCESS |
00517 */
00518 TEST(pal_tls, tlsHandshakeTCP)
00519 {
00520     handshakeTCP(false);
00521 }
00522 
00523 /**
00524 * @brief Test TLS handshake (TCP non-blocking).
00525 *
00526 *
00527 * | # |    Step                        |   Expected  |
00528 * |---|--------------------------------|-------------|
00529 * | 1 | Create a TCP (non-blocking) socket.                                    | PAL_SUCCESS |
00530 * | 2 | Perform a DNS lookup on the server address.                                | PAL_SUCCESS |
00531 * | 3 | Set the server port.                                                     | PAL_SUCCESS |
00532 * | 4 | Connect the TCP socket to the server.                                        | PAL_SUCCESS |
00533 * | 5 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
00534 * | 6 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
00535 * | 7 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
00536 * | 8 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
00537 * | 9 | Set the socket chain to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
00538 * | 10 | Perform a TLS handshake with the server using `pal_handShaket` in a loop. | PAL_SUCCESS |
00539 * | 11 | Verify the handshake result using `pal_sslGetVerifyResult`.               | PAL_SUCCESS |
00540 * | 12 | Write data over the open TLS connection using `pal_sslWrite`.            | PAL_SUCCESS |
00541 * | 13 | Wait for the response.                                                  | PAL_SUCCESS |
00542 * | 14 | Read data from the open TLS connection using `pal_sslRead`.               | PAL_SUCCESS |
00543 * | 15 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
00544 * | 16 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
00545 * | 17 | Close the TCP socket.                                                   | PAL_SUCCESS |
00546 */
00547 TEST(pal_tls, tlsHandshakeTCP_nonBlocking)
00548 {
00549     handshakeTCP(true);
00550 }
00551 
00552 /**
00553 * @brief Test (D)TLS handshake (UDP -blocking).
00554 *
00555 *
00556 * | # |    Step                        |   Expected  |
00557 * |---|--------------------------------|-------------|
00558 * | 1 | Create a UDP (blocking) socket.                                        | PAL_SUCCESS |
00559 * | 2 | Perform a DNS lookup on the server address.                                | PAL_SUCCESS |
00560 * | 3 | Set the server port.                                                     | PAL_SUCCESS |
00561 * | 4 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
00562 * | 5 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
00563 * | 6 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
00564 * | 7 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
00565 * | 8 | Set the socket chain to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
00566 * | 9 | Set the timeout for the handshake using `pal_setHandShakeTimeOut`.         | PAL_SUCCESS |
00567 * | 10 | Perform a TLS handshake with the server using `pal_handShaket` in a loop. | PAL_SUCCESS |
00568 * | 11 | Verify the handshake result using `pal_sslGetVerifyResult`.               | PAL_SUCCESS |
00569 * | 12 | Write data over the open TLS connection using `pal_sslWrite`.            | PAL_SUCCESS |
00570 * | 13 | Wait for the response.                                                  | PAL_SUCCESS |
00571 * | 14 | Read data from the open TLS connection using `pal_sslRead`.               | PAL_SUCCESS |
00572 * | 15 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
00573 * | 16 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
00574 * | 17 | Close the UDP socket.                                                   | PAL_SUCCESS |
00575 */
00576 TEST(pal_tls, tlsHandshakeUDP)
00577 {
00578     handshakeUDP(false);
00579 }
00580 
00581 /**
00582 * @brief Test (D)TLS handshake (UDP -NonBlocking).
00583 *
00584 *
00585 * | # |    Step                        |   Expected  |
00586 * |---|--------------------------------|-------------|
00587 * | 1 | Create a UDP (blocking) socket.                                        | PAL_SUCCESS |
00588 * | 2 | Perform a DNS lookup on the server address.                                | PAL_SUCCESS |
00589 * | 3 | Set the server port.                                                     | PAL_SUCCESS |
00590 * | 4 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
00591 * | 5 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
00592 * | 6 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
00593 * | 7 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
00594 * | 8 | Set the socket chain to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
00595 * | 9 | Set the timeout for the handshake using `pal_setHandShakeTimeOut`.         | PAL_SUCCESS |
00596 * | 10 | Perform a TLS handshake with the server using `pal_handShaket` in a loop. | PAL_SUCCESS |
00597 * | 11 | Verify the handshake result using `pal_sslGetVerifyResult`.               | PAL_SUCCESS |
00598 * | 12 | Write data over the open TLS connection using `pal_sslWrite`.            | PAL_SUCCESS |
00599 * | 13 | Wait for the response.                                                  | PAL_SUCCESS |
00600 * | 14 | Read data from the open TLS connection using `pal_sslRead`.               | PAL_SUCCESS |
00601 * | 15 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
00602 * | 16 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
00603 * | 17 | Close the UDP socket.                                                   | PAL_SUCCESS |
00604 */
00605 TEST(pal_tls, tlsHandshakeUDP_NonBlocking)
00606 {
00607     handshakeUDP(true);
00608 }
00609 
00610 /**
00611 * @brief Test (D)TLS handshake (UDP non-blocking) with a very short timeout to see if you get a timeout.
00612 *
00613 *
00614 * | # |    Step                        |   Expected  |
00615 * |---|--------------------------------|-------------|
00616 * | 1 | Create a UDP (blocking) socket.                                        | PAL_SUCCESS |
00617 * | 2 | Perform a DNS lookup on server adderss.                                | PAL_SUCCESS |
00618 * | 3 | Set the server port.                                                     | PAL_SUCCESS |
00619 * | 4 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
00620 * | 5 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
00621 * | 6 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
00622 * | 7 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
00623 * | 8 | Set the socket chain to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
00624 * | 9 | Set a short timeout for the handshake using `pal_setHandShakeTimeOut`.   | PAL_SUCCESS |
00625 * | 10 | Perform a TLS handshake with the server using `pal_handShaket` in a loop. | PAL_ERR_TIMEOUT_EXPIRED |
00626 * | 11 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
00627 * | 12 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
00628 */
00629 TEST(pal_tls, tlsHandshakeUDPTimeOut)
00630 {
00631     palStatus_t status = PAL_SUCCESS;
00632     palTLSConfHandle_t palTLSConf = NULLPTR;
00633     palTLSHandle_t palTLSHandle = NULLPTR;
00634     palTLSTransportMode_t transportationMode = PAL_DTLS_MODE;
00635     palSocketAddress_t socketAddr = { 0 };
00636     palSocketLength_t addressLength = 0;
00637     #if (PAL_ENABLE_X509 == 1)
00638         palX509_t pubKey = { (const void*)g_pubKey,sizeof(g_pubKey) };
00639         palPrivateKey_t prvKey = { (const void*)g_prvKey,sizeof(g_prvKey) };
00640         palX509_t caCert = { (const void*)pal_test_cas,sizeof(pal_test_cas) };
00641     #elif (PAL_ENABLE_PSK == 1)
00642         const char* identity = PAL_TEST_PSK_IDENTITY;
00643         const char psk[]= PAL_TEST_PSK;
00644     #endif 
00645     palTLSSocket_t tlsSocket = { g_socket, &socketAddr, 0, transportationMode };
00646     
00647     uint64_t curTimeInSec;
00648     const uint64_t minSecSinceEpoch = PAL_MIN_SEC_FROM_EPOCH + 1; //At least 47 years passed from 1.1.1970 in seconds      
00649     
00650     /*#1*/
00651     status = pal_socket(PAL_AF_INET, PAL_SOCK_DGRAM , false, 0, &g_socket);
00652     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00653     /*#2*/
00654     status = pal_getAddressInfo(PAL_TLS_TEST_SERVER_ADDRESS, &socketAddr, &addressLength);
00655     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00656 
00657     tlsSocket.addressLength = addressLength;
00658     tlsSocket.socket = g_socket;
00659     /*#3*/
00660     status = pal_setSockAddrPort(&socketAddr, DTLS_SERVER_PORT_TIMEOUT);
00661     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00662     /*#4*/
00663     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
00664     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00665     /*#5*/
00666     status = pal_initTLS(palTLSConf, &palTLSHandle);
00667     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00668 
00669     // This code commented out to prevent massive prints from mbedTLS, if you want to see logs from client side, just uncomment them.
00670     //status = pal_sslDebugging(true);
00671     //TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00672     #if (PAL_ENABLE_X509 == 1)
00673         /*#6*/
00674         status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
00675         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00676         /*#7*/
00677         status = pal_setCAChain(palTLSConf, &caCert, NULL);
00678         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00679     #elif (PAL_ENABLE_PSK == 1)
00680         /*#6 + #7*/
00681         status = pal_setPSK(palTLSConf, (const unsigned char*)identity, strlen(identity), (const unsigned char*)psk, sizeof(psk));
00682         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00683     #endif
00684     /*#8*/
00685     status = pal_tlsSetSocket(palTLSConf, &tlsSocket);
00686     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00687     /*#9*/
00688     status = pal_setHandShakeTimeOut(palTLSConf, 100);
00689     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00690 
00691     status = pal_osSetTime(minSecSinceEpoch);
00692     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status); // More than current epoch time -> success    
00693     /*#10*/
00694     do
00695     {
00696         status = pal_handShake(palTLSHandle, palTLSConf);
00697     }
00698     while (PAL_ERR_TLS_WANT_READ == status || PAL_ERR_TLS_WANT_WRITE == status);
00699 
00700     curTimeInSec = pal_osGetTime();
00701     TEST_ASSERT_EQUAL_HEX(PAL_ERR_TIMEOUT_EXPIRED , status);
00702     TEST_ASSERT_TRUE(curTimeInSec - minSecSinceEpoch <= 1); //less than one second             
00703     /*#11*/
00704     status = pal_freeTLS(&palTLSHandle);
00705     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00706     /*#12*/
00707     status = pal_tlsConfigurationFree(&palTLSConf);
00708     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00709 
00710     status = pal_close(&g_socket);
00711     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00712 }
00713 
00714 #if PAL_USE_INTERNAL_FLASH
00715 /**
00716 * @brief Test TLS handshake (TCP blocking).
00717 *
00718 *
00719 * | # |    Step                        |   Expected  |
00720 * |---|--------------------------------|-------------|
00721 * | 1 | Create a TCP (blocking) socket.                                        | PAL_SUCCESS |
00722 * | 2 | Perform a DNS lookup on the server address.                                | PAL_SUCCESS |
00723 * | 3 | Set the server port.                                                     | PAL_SUCCESS |
00724 * | 4 | Connect the TCP socket to the server.                                        | PAL_SUCCESS |
00725 * | 5 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
00726 * | 6 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
00727 * | 7 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
00728 * | 8 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
00729 * | 9 | Set the socket chain to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
00730 * | 10 | Set device time to be in future.                                          | PAL_SUCCESS |
00731 * | 11 | Perform a TLS handshake with the server using `pal_handShaket`.           | PAL_SUCCESS |
00732 * | 12 | Verify the handshake result using `pal_sslGetVerifyResult`.               | PAL_SUCCESS |
00733 * | 13 | Write data over open TLS connection using `pal_sslWrite`.            | PAL_SUCCESS |
00734 * | 14 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
00735 * | 15 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
00736 * | 16 | Close the TCP socket.                                                   | PAL_SUCCESS |
00737 * | 17 | Check that time is updated.                                               | PAL_SUCCESS |
00738 * | 18 | Verify that the SOTP time value was updated.                          | PAL_SUCCESS |
00739 */
00740 TEST(pal_tls, tlsHandshakeTCP_FutureLWM2M)
00741 {
00742     #if ((PAL_USE_SECURE_TIME == 1) && (PAL_USE_INTERNAL_FLASH == 1))
00743     palStatus_t status = PAL_SUCCESS;
00744     palTLSConfHandle_t palTLSConf = NULLPTR;
00745     palTLSHandle_t palTLSHandle = NULLPTR;
00746     palTLSTransportMode_t transportationMode =     PAL_TLS_MODE;
00747     palSocketAddress_t socketAddr = {0};
00748     palSocketLength_t addressLength = 0;
00749     uint32_t written = 0;
00750     palX509_t pubKey = {(const void*)g_pubKey,sizeof(g_pubKey)};
00751     palPrivateKey_t prvKey = {(const void*)g_prvKey,sizeof(g_prvKey)};
00752     palX509_t caCert = { (const void*)pal_test_cas,sizeof(pal_test_cas) };
00753     palTLSSocket_t tlsSocket = { g_socket, &socketAddr, 0, transportationMode };
00754     
00755     char serverResponse[PAL_TLS_MESSAGE_SIZE] = {0};
00756     uint32_t actualLen = 0;
00757     uint64_t deviceTime = pal_osGetTime(); //get device time to update it in case of failure
00758     uint64_t currentTime = 0;
00759     uint16_t actualSavedTimeSize = 0;
00760     uint64_t initialSOTPTime = 0;
00761     sotp_result_e sotpRes = SOTP_SUCCESS;
00762     int32_t verifyResult = 0;
00763 
00764     /*#1*/
00765     status = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &g_socket);
00766     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00767     /*#2*/
00768     status = pal_getAddressInfo(PAL_TLS_TEST_SERVER_ADDRESS, &socketAddr, &addressLength);
00769     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00770 
00771     tlsSocket.addressLength = addressLength;
00772     tlsSocket.socket = g_socket;
00773     /*#3*/
00774     status = pal_setSockAddrPort(&socketAddr, TLS_RENEGOTIATE_SERVER_PORT);
00775     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00776     /*#4*/
00777     status = pal_connect(g_socket, &socketAddr, addressLength);
00778     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00779     /*#5*/
00780     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
00781     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00782     /*#6*/
00783     status = pal_initTLS(palTLSConf, &palTLSHandle);
00784     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00785     /*#7*/
00786     status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
00787     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00788     /*#8*/
00789     status = pal_setCAChain(palTLSConf, &caCert, NULL);
00790     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status); 
00791     /*#9*/
00792     status = pal_tlsSetSocket(palTLSConf, &tlsSocket);
00793     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00794     /*#10*/
00795 
00796     sotpRes = sotp_set(SOTP_TYPE_SAVED_TIME, (uint16_t)sizeof(initialSOTPTime), (uint32_t*)&initialSOTPTime);
00797     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
00798     status = pal_osSetTime(0);//back in the past to set time to the future during handhsake
00799     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00800     /*#11*/
00801     status = pal_handShake(palTLSHandle, palTLSConf);
00802     if (PAL_SUCCESS != status)
00803     {
00804         pal_osSetTime(deviceTime);
00805     }
00806     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00807     /*#12*/
00808     status = pal_sslGetVerifyResultExtended(palTLSHandle, &verifyResult);
00809     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00810     /*#13*/
00811     status = pal_sslWrite(palTLSHandle, TLS_GET_REQUEST, sizeof(TLS_GET_REQUEST), &written);
00812     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00813 
00814     pal_osDelay(5000);
00815     /*#14*/
00816     status = pal_sslRead(palTLSHandle, serverResponse, PAL_TLS_MESSAGE_SIZE, &actualLen);
00817     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00818     /*#14*/
00819     status = pal_freeTLS(&palTLSHandle);
00820     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00821     /*#15*/
00822     status = pal_tlsConfigurationFree(&palTLSConf);
00823     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00824     /*#16*/
00825     status = pal_close(&g_socket);
00826     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00827     /*#17*/
00828     deviceTime = pal_osGetTime();
00829     TEST_ASSERT_TRUE(0 != deviceTime);
00830     /*#18*/
00831     sotpRes = sotp_get(SOTP_TYPE_SAVED_TIME, sizeof(currentTime), (uint32_t*)&currentTime, &actualSavedTimeSize);
00832     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
00833     TEST_ASSERT_TRUE(0 != currentTime);
00834     #endif 
00835 }
00836 
00837 /**
00838 * @brief Test TLS handshake (TCP blocking) with near future time and validate that the handshake didn't update the device time (due to set time rules)
00839 *
00840 *
00841 * | # |    Step                        |   Expected  |
00842 * |---|--------------------------------|-------------|
00843 * | 1 | Get saved time from SOTP, move backward half day and set time to RAM    | PAL_SUCCESS |
00844 * | 2 | Update `SOTP_TYPE_SAVED_TIME` directly in SOTP to the new time from #1  | PAL_SUCCESS |
00845 * | 3 | Create a TCP (blocking) socket.                                         | PAL_SUCCESS |
00846 * | 4 | Perform a DNS lookup on the server address.                             | PAL_SUCCESS |
00847 * | 5 | Set the server port.                                                    | PAL_SUCCESS |
00848 * | 6 | Connect the TCP socket to the server.                                        | PAL_SUCCESS |
00849 * | 7 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
00850 * | 8 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
00851 * | 9 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
00852 * | 10 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
00853 * | 11 | Set the socket to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
00854 * | 12 | Perform a TLS handshake with the server using `pal_handShake`.           | PAL_SUCCESS |
00855 * | 13 | Verify the handshake result using `pal_sslGetVerifyResult`.               | PAL_SUCCESS |
00856 * | 14 | Write data over open TLS connection using `pal_sslWrite`.            | PAL_SUCCESS |
00857 * | 15 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
00858 * | 16 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
00859 * | 17 | Verify that the time was NOT updated during the handshake.                        | PAL_SUCCESS |
00860 */
00861 TEST(pal_tls, tlsHandshakeTCP_FutureLWM2M_NoTimeUpdate)
00862 {
00863     #if ((PAL_USE_SECURE_TIME == 1) && (PAL_USE_INTERNAL_FLASH == 1))
00864     palStatus_t status = PAL_SUCCESS;
00865     palTLSConfHandle_t palTLSConf = NULLPTR;
00866     palTLSHandle_t palTLSHandle = NULLPTR;
00867     palTLSTransportMode_t transportationMode = PAL_TLS_MODE;
00868     palSocketAddress_t socketAddr = { 0 };
00869     palSocketLength_t addressLength = 0;
00870     uint32_t written = 0;
00871     char serverResponse[PAL_TLS_MESSAGE_SIZE] = {0};
00872     uint32_t actualLen = 0;
00873     palX509_t pubKey = { (const void*)g_pubKey,sizeof(g_pubKey) };
00874     palPrivateKey_t prvKey = { (const void*)g_prvKey,sizeof(g_prvKey) };
00875     palTLSSocket_t tlsSocket = { g_socket, &socketAddr, 0, transportationMode };
00876     palX509_t caCert = { (const void*)pal_test_cas,sizeof(pal_test_cas) };
00877     sotp_result_e sotpRes = SOTP_SUCCESS;
00878     uint64_t currentTime = 0;
00879     uint64_t tmpTime = 0;
00880     uint64_t updatedTime = 0;
00881     uint16_t actualSavedTimeSize = 0;
00882     int32_t verifyResult = 0;
00883 
00884     /*#1*/
00885     sotpRes = sotp_get(SOTP_TYPE_SAVED_TIME, sizeof(tmpTime), (uint32_t*)&tmpTime, &actualSavedTimeSize);
00886     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
00887 
00888     currentTime = tmpTime - (PAL_SECONDS_PER_DAY / 2); //going back half day to simulate future server by half day (in order to prevent time update)
00889     status = pal_osSetTime(currentTime);
00890     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00891     /*#2*/
00892     sotpRes = sotp_set(SOTP_TYPE_SAVED_TIME, (uint16_t)sizeof(currentTime), (uint32_t*)&currentTime);
00893     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
00894 
00895     /*#3*/
00896     status = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &g_socket);
00897     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00898     /*#4*/
00899     status = pal_getAddressInfo(PAL_TLS_TEST_SERVER_ADDRESS, &socketAddr, &addressLength);
00900     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00901     /*#5*/
00902     status = pal_setSockAddrPort(&socketAddr, TLS_RENEGOTIATE_SERVER_PORT);
00903     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00904 
00905     tlsSocket.addressLength = addressLength;
00906     tlsSocket.socket = g_socket;
00907     
00908     /*#6*/
00909     status = pal_connect(g_socket, &socketAddr, addressLength);
00910     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00911     /*#7*/
00912     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
00913     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00914     /*#8*/
00915     status = pal_initTLS(palTLSConf, &palTLSHandle);
00916     if (PAL_SUCCESS != status)
00917     {
00918         pal_freeTLS(&palTLSHandle);
00919         pal_tlsConfigurationFree(&palTLSConf);
00920         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00921     }
00922 
00923     /*#9*/
00924     status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
00925     if (PAL_SUCCESS != status)
00926     {
00927         pal_freeTLS(&palTLSHandle);
00928         pal_tlsConfigurationFree(&palTLSConf);
00929         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00930     }
00931     /*#10*/
00932     status = pal_setCAChain(palTLSConf, &caCert, NULL);
00933     if (PAL_SUCCESS != status)
00934     {
00935         pal_freeTLS(&palTLSHandle);
00936         pal_tlsConfigurationFree(&palTLSConf);
00937         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00938     }
00939     /*#11*/
00940     status = pal_tlsSetSocket(palTLSConf, &tlsSocket);
00941     if (PAL_SUCCESS != status)
00942     {
00943         pal_freeTLS(&palTLSHandle);
00944         pal_tlsConfigurationFree(&palTLSConf);
00945         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00946     }
00947     /*#12*/
00948     status = pal_handShake(palTLSHandle, palTLSConf);
00949     if (PAL_SUCCESS != status)
00950     {
00951         pal_freeTLS(&palTLSHandle);
00952         pal_tlsConfigurationFree(&palTLSConf);
00953         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00954     }
00955     /*#13*/
00956     status = pal_sslGetVerifyResultExtended(palTLSHandle, &verifyResult);
00957     if (PAL_SUCCESS != status)
00958     {
00959         pal_freeTLS(&palTLSHandle);
00960         pal_tlsConfigurationFree(&palTLSConf);
00961         TEST_ASSERT_TRUE(PAL_ERR_X509_BADCERT_EXPIRED & verifyResult);
00962     }
00963     /*#14*/
00964     status = pal_sslWrite(palTLSHandle, TLS_GET_REQUEST, sizeof(TLS_GET_REQUEST), &written);
00965     if (PAL_SUCCESS != status)
00966     {
00967         pal_freeTLS(&palTLSHandle);
00968         pal_tlsConfigurationFree(&palTLSConf);
00969         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00970     }
00971 
00972     pal_osDelay(5000);
00973     /*#14*/
00974     status = pal_sslRead(palTLSHandle, serverResponse, PAL_TLS_MESSAGE_SIZE, &actualLen);
00975     if (PAL_SUCCESS != status)
00976     {
00977         pal_freeTLS(&palTLSHandle);
00978         pal_tlsConfigurationFree(&palTLSConf);
00979         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00980     }
00981 
00982     /*#15*/
00983     status = pal_freeTLS(&palTLSHandle);
00984     if (PAL_SUCCESS != status)
00985     {
00986         pal_tlsConfigurationFree(&palTLSConf);
00987         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00988     }
00989     /*#16*/
00990     status = pal_tlsConfigurationFree(&palTLSConf);
00991     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00992 
00993     status = pal_close(&g_socket);
00994     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
00995 
00996     /*#17*/ 
00997     sotpRes = sotp_get(SOTP_TYPE_SAVED_TIME, sizeof(updatedTime), (uint32_t*)&updatedTime, &actualSavedTimeSize);
00998     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
00999     TEST_ASSERT_EQUAL_HEX(currentTime, updatedTime);
01000     #endif
01001 }
01002 
01003 
01004 /**
01005 * @brief Test TLS handshake (TCP blocking) with future time to make handshake to fail due to bad cert time from server.
01006 *
01007 *
01008 * | # |    Step                        |   Expected  |
01009 * |---|--------------------------------|-------------|
01010 * | 1 | Create a TCP (blocking) socket.                                        | PAL_SUCCESS |
01011 * | 2 | Perform a DNS lookup on the server address.                                | PAL_SUCCESS |
01012 * | 3 | Set the server port.                                                     | PAL_SUCCESS |
01013 * | 4 | Connect the TCP socket to the server.                                        | PAL_SUCCESS |
01014 * | 5 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
01015 * | 6 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
01016 * | 7 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
01017 * | 8 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
01018 * | 9 | Set the socket chain to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
01019 * | 10 | Setsystem time to be far in the future `pal_osSetTime`.                   | PAL_SUCCESS |
01020 * | 11 | Perform a TLS handshake with the server using `pal_handShake`.           | PAL_ERR_X509_CERT_VERIFY_FAILED |
01021 * | 12 | Verify the handshake result using `pal_sslGetVerifyResult`.               | PAL_ERR_X509_BADCERT_EXPIRED |
01022 * | 13 | Set tme back to the original time before the test.                        | PAL_SUCCESS |
01023 * | 14 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
01024 * | 15 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
01025 * | 16 | Verify that the SOTP time value was not changed.                          | PAL_SUCCESS |
01026 */
01027 TEST(pal_tls, tlsHandshakeTCP_ExpiredLWM2MCert)
01028 {
01029     #if ((PAL_USE_SECURE_TIME == 1) && (PAL_USE_INTERNAL_FLASH == 1))
01030     palStatus_t status = PAL_SUCCESS;
01031     palTLSConfHandle_t palTLSConf = NULLPTR;
01032     palTLSHandle_t palTLSHandle = NULLPTR;
01033     palTLSTransportMode_t transportationMode = PAL_TLS_MODE;
01034     palSocketAddress_t socketAddr = {0};
01035     palSocketLength_t addressLength = 0;
01036     palX509_t pubKey = {(const void*)g_pubKey,sizeof(g_pubKey)};
01037     palPrivateKey_t prvKey = {(const void*)g_prvKey,sizeof(g_prvKey)};
01038     palTLSSocket_t tlsSocket = { g_socket, &socketAddr, 0, transportationMode };
01039     palX509_t caCert = { (const void*)pal_test_cas,sizeof(pal_test_cas) };
01040     uint64_t futureTime = 2145542642; //Wed, 27 Dec 2037 16:04:02 GMT
01041     uint64_t currentTime = 0;
01042     uint64_t currentSOTPTime = 0;
01043     uint16_t actualSavedTimeSize = 0;
01044     sotp_result_e sotpRes = SOTP_SUCCESS;
01045     int32_t verifyResult = 0;
01046 
01047 
01048     /*#1*/
01049     status = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &g_socket);
01050     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01051     /*#2*/
01052     status = pal_getAddressInfo(PAL_TLS_TEST_SERVER_ADDRESS, &socketAddr, &addressLength);
01053     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01054 
01055     tlsSocket.addressLength = addressLength;
01056     tlsSocket.socket = g_socket;
01057     /*#3*/
01058     status = pal_setSockAddrPort(&socketAddr, TLS_RENEGOTIATE_SERVER_PORT);
01059     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01060     /*#4*/
01061     status = pal_connect(g_socket, &socketAddr, addressLength);
01062     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01063     /*#5*/
01064     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
01065     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01066     /*#6*/
01067     status = pal_initTLS(palTLSConf, &palTLSHandle);
01068     if (PAL_SUCCESS != status)
01069     {
01070         pal_freeTLS(&palTLSHandle);
01071         pal_tlsConfigurationFree(&palTLSConf);
01072         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01073     }
01074     
01075     /*#7*/
01076     status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
01077     if (PAL_SUCCESS != status)
01078     {
01079         pal_freeTLS(&palTLSHandle);
01080         pal_tlsConfigurationFree(&palTLSConf);
01081         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01082     }
01083     /*#8*/
01084     status = pal_setCAChain(palTLSConf, &caCert, NULL);
01085     if (PAL_SUCCESS != status)
01086     {
01087         pal_freeTLS(&palTLSHandle);
01088         pal_tlsConfigurationFree(&palTLSConf);
01089         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01090     }
01091     /*#9*/
01092     status = pal_tlsSetSocket(palTLSConf, &tlsSocket);
01093     if (PAL_SUCCESS != status)
01094     {
01095         pal_freeTLS(&palTLSHandle);
01096         pal_tlsConfigurationFree(&palTLSConf);
01097         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01098     }
01099     /*#10*/
01100     sotpRes = sotp_get(SOTP_TYPE_SAVED_TIME, sizeof(currentTime), (uint32_t*)&currentTime, &actualSavedTimeSize);
01101     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01102     status = pal_osSetTime(futureTime);
01103     if (PAL_SUCCESS != status)
01104     {
01105         pal_freeTLS(&palTLSHandle);
01106         pal_tlsConfigurationFree(&palTLSConf);
01107         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01108     }
01109     /*#11*/
01110     status = pal_handShake(palTLSHandle, palTLSConf);
01111     if (PAL_ERR_X509_CERT_VERIFY_FAILED != status)
01112     {
01113         pal_osSetTime(currentTime);
01114         pal_freeTLS(&palTLSHandle);
01115         pal_tlsConfigurationFree(&palTLSConf);
01116         TEST_ASSERT_EQUAL_HEX(PAL_ERR_X509_CERT_VERIFY_FAILED, status);
01117     }
01118     /*#12*/
01119     status = pal_sslGetVerifyResultExtended(palTLSHandle, &verifyResult);
01120     if ((PAL_ERR_X509_CERT_VERIFY_FAILED != status) || (0 == (PAL_ERR_X509_BADCERT_EXPIRED & verifyResult)))
01121     {
01122         pal_osSetTime(currentTime);
01123         pal_freeTLS(&palTLSHandle);
01124         pal_tlsConfigurationFree(&palTLSConf);
01125         TEST_ASSERT_TRUE(PAL_ERR_X509_BADCERT_EXPIRED & verifyResult);
01126     }
01127     /*#13*/
01128     status = pal_osSetTime(currentTime);
01129     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01130     /*#14*/
01131     status = pal_freeTLS(&palTLSHandle);
01132     if (PAL_SUCCESS != status)
01133     {
01134         pal_tlsConfigurationFree(&palTLSConf);
01135         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01136     }
01137     /*#15*/
01138     status = pal_tlsConfigurationFree(&palTLSConf);
01139     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01140 
01141     status = pal_close(&g_socket);
01142     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01143 
01144     /*#16*/
01145     sotpRes = sotp_get(SOTP_TYPE_SAVED_TIME, sizeof(currentSOTPTime), (uint32_t*)&currentSOTPTime, &actualSavedTimeSize);
01146     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01147     TEST_ASSERT_TRUE(futureTime <= currentSOTPTime);
01148     #endif 
01149 }
01150 
01151 /**
01152 * @brief Test TLS handshake (TCP blocking) with future time to make handshake update the device time according to the server time.
01153 *
01154 *
01155 * | # |    Step                        |   Expected  |
01156 * |---|--------------------------------|-------------|
01157 * | 1 | Create a TCP (blocking) socket.                                        | PAL_SUCCESS |
01158 * | 2 | Perform a DNS lookup on the server address.                                | PAL_SUCCESS |
01159 * | 3 | Set the server port.                                                     | PAL_SUCCESS |
01160 * | 4 | Parse the CA cert.                                                     | PAL_SUCCESS |
01161 * | 5 | Get the CA cert ID.                                                     | PAL_SUCCESS |
01162 * | 6 | Set the CA cert ID into the SOTP.                                            | PAL_SUCCESS |
01163 * | 7 | Connect the TCP socket to the server.                                        | PAL_SUCCESS |
01164 * | 8 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
01165 * | 9 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
01166 * | 10 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
01167 * | 11 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
01168 * | 12 | Set the socket to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
01169 * | 13 | Set system time to be far in the future `pal_osSetTime`.                   | PAL_SUCCESS |
01170 * | 14 | Perform a TLS handshake with the server using `pal_handShake`.           | PAL_SUCCESS |
01171 * | 15 | Verify the handshake result using `pal_sslGetVerifyResult`.               | PAL_SUCCESS |
01172 * | 16 | Write data over open TLS connection using `pal_sslWrite`.            | PAL_SUCCESS |
01173 * | 17 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
01174 * | 18 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
01175 * | 19 | Free X509 handle.                                                   | PAL_SUCCESS |
01176 * | 20 | Verify that the time updated during the handshake.                        | PAL_SUCCESS |
01177 */
01178 TEST(pal_tls, tlsHandshakeTCP_ExpiredServerCert_Trusted)
01179 {
01180     #if ((PAL_USE_SECURE_TIME == 1) && (PAL_USE_INTERNAL_FLASH == 1))
01181     palStatus_t status = PAL_SUCCESS;
01182     palTLSConfHandle_t palTLSConf = NULLPTR;
01183     palTLSHandle_t palTLSHandle = NULLPTR;
01184     palTLSTransportMode_t transportationMode = PAL_TLS_MODE;
01185     palSocketAddress_t socketAddr = { 0 };
01186     palSocketLength_t addressLength = 0;
01187     char serverResponse[PAL_TLS_MESSAGE_SIZE] = {0};
01188     uint32_t actualLen = 0;
01189     uint32_t written = 0;
01190     palX509_t pubKey = { (const void*)g_pubKey,sizeof(g_pubKey) };
01191     palPrivateKey_t prvKey = { (const void*)g_prvKey,sizeof(g_prvKey) };
01192     palTLSSocket_t tlsSocket = { g_socket, &socketAddr, 0, transportationMode };
01193     palX509_t caCert = { (const void*)pal_test_cas,sizeof(pal_test_cas) };
01194     uint64_t futureTime = 2145542642; //Wed, 27 Dec 2037 16:04:02 GMT
01195     uint64_t updatedTime = 0;
01196     uint16_t actualSavedTimeSize = 0;
01197     palX509Handle_t trustedServerCA = NULLPTR;
01198     sotp_result_e sotpRes = SOTP_SUCCESS;
01199     int32_t verifyResult = 0;
01200 
01201     /*#1*/
01202     status = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &g_socket);
01203     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01204     /*#2*/
01205     status = pal_getAddressInfo(PAL_TLS_TEST_SERVER_ADDRESS, &socketAddr, &addressLength);
01206     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01207     /*#3*/
01208     status = pal_setSockAddrPort(&socketAddr, TLS_RENEGOTIATE_SERVER_PORT);
01209     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01210     
01211     tlsSocket.addressLength = addressLength;
01212     tlsSocket.socket = g_socket;
01213     /*#4*/
01214     status = pal_x509Initiate(&trustedServerCA);
01215     TEST_ASSERT_NOT_EQUAL(trustedServerCA, NULLPTR);
01216     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01217 
01218     status = pal_x509CertParse(trustedServerCA, (const unsigned char *)pal_test_cas, sizeof(pal_test_cas));
01219     if (PAL_SUCCESS != status)
01220     {
01221         pal_x509Free(&trustedServerCA);
01222         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01223     }
01224     /*#5*/
01225     status = pal_x509CertGetAttribute(trustedServerCA, PAL_X509_CERT_ID_ATTR, g_trustedServerID, sizeof(g_trustedServerID), &g_actualServerIDSize);
01226     if (PAL_SUCCESS != status)
01227     {
01228         pal_x509Free(&trustedServerCA);
01229         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01230     }
01231     /*#6*/
01232     sotpRes = sotp_set(SOTP_TYPE_TRUSTED_TIME_SRV_ID, g_actualServerIDSize, (uint32_t*)g_trustedServerID);
01233     if (SOTP_SUCCESS != sotpRes)
01234     {
01235         pal_x509Free(&trustedServerCA);
01236         TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01237     }
01238 
01239     /*#7*/
01240     status = pal_connect(g_socket, &socketAddr, addressLength);
01241     if (PAL_SUCCESS != status)
01242     {
01243         pal_x509Free(&trustedServerCA);
01244         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01245     }
01246     /*#8*/
01247     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
01248     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01249     /*#9*/
01250     status = pal_initTLS(palTLSConf, &palTLSHandle);
01251     if (PAL_SUCCESS != status)
01252     {
01253         pal_freeTLS(&palTLSHandle);
01254         pal_tlsConfigurationFree(&palTLSConf);
01255         pal_x509Free(&trustedServerCA);
01256         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01257     }
01258 
01259     /*#10*/
01260     status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
01261     if (PAL_SUCCESS != status)
01262     {
01263         pal_freeTLS(&palTLSHandle);
01264         pal_tlsConfigurationFree(&palTLSConf);
01265         pal_x509Free(&trustedServerCA);
01266         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01267     }
01268     /*#11*/
01269     status = pal_setCAChain(palTLSConf, &caCert, NULL);
01270     if (PAL_SUCCESS != status)
01271     {
01272         pal_freeTLS(&palTLSHandle);
01273         pal_tlsConfigurationFree(&palTLSConf);
01274         pal_x509Free(&trustedServerCA);
01275         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01276     }
01277     /*#12*/
01278     status = pal_tlsSetSocket(palTLSConf, &tlsSocket);
01279     if (PAL_SUCCESS != status)
01280     {
01281         pal_freeTLS(&palTLSHandle);
01282         pal_tlsConfigurationFree(&palTLSConf);
01283         pal_x509Free(&trustedServerCA);
01284         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01285     }
01286     /*#13*/
01287     status = pal_osSetStrongTime(futureTime);
01288     if (PAL_SUCCESS != status)
01289     {
01290         pal_freeTLS(&palTLSHandle);
01291         pal_tlsConfigurationFree(&palTLSConf);
01292         pal_x509Free(&trustedServerCA);
01293         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01294     }
01295     /*#14*/
01296     status = pal_handShake(palTLSHandle, palTLSConf);
01297     if (PAL_SUCCESS != status)
01298     {
01299         pal_freeTLS(&palTLSHandle);
01300         pal_tlsConfigurationFree(&palTLSConf);
01301         pal_x509Free(&trustedServerCA);
01302         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01303     }
01304     /*#15*/
01305     status = pal_sslGetVerifyResultExtended(palTLSHandle, &verifyResult);
01306     if (PAL_SUCCESS != status)
01307     {
01308         pal_freeTLS(&palTLSHandle);
01309         pal_tlsConfigurationFree(&palTLSConf);
01310         pal_x509Free(&trustedServerCA);
01311         TEST_ASSERT_TRUE(PAL_ERR_X509_BADCERT_EXPIRED & verifyResult);
01312     }
01313     /*#16*/
01314     status = pal_sslWrite(palTLSHandle, TLS_GET_REQUEST, sizeof(TLS_GET_REQUEST), &written);
01315     if (PAL_SUCCESS != status)
01316     {
01317         pal_freeTLS(&palTLSHandle);
01318         pal_tlsConfigurationFree(&palTLSConf);
01319         pal_x509Free(&trustedServerCA);
01320         TEST_ASSERT_EQUAL_HEX(PAL_ERR_X509_BADCERT_EXPIRED, status);
01321     }
01322 
01323     pal_osDelay(5000);
01324     /*#14*/
01325     status = pal_sslRead(palTLSHandle, serverResponse, PAL_TLS_MESSAGE_SIZE, &actualLen);
01326     if (PAL_SUCCESS != status)
01327     {
01328         pal_freeTLS(&palTLSHandle);
01329         pal_tlsConfigurationFree(&palTLSConf);
01330         pal_x509Free(&trustedServerCA);
01331         TEST_ASSERT_EQUAL_HEX(PAL_ERR_X509_BADCERT_EXPIRED, status);
01332     }
01333 
01334     /*#17*/
01335     status = pal_freeTLS(&palTLSHandle);
01336     if (PAL_SUCCESS != status)
01337     {
01338         pal_x509Free(&trustedServerCA);
01339         pal_tlsConfigurationFree(&palTLSConf);
01340         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01341     }
01342     /*#18*/
01343     status = pal_tlsConfigurationFree(&palTLSConf);
01344     if (PAL_SUCCESS != status)
01345     {
01346         pal_x509Free(&trustedServerCA);
01347         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01348     }
01349     /*#19*/
01350     status = pal_x509Free(&trustedServerCA);
01351     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01352     /*#20*/
01353     updatedTime = pal_osGetTime();
01354     TEST_ASSERT_TRUE(updatedTime < futureTime);
01355 
01356     status = pal_close(&g_socket);
01357     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01358     
01359     sotpRes = sotp_get(SOTP_TYPE_SAVED_TIME, sizeof(updatedTime), (uint32_t*)&updatedTime, &actualSavedTimeSize);
01360     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01361     TEST_ASSERT_TRUE(updatedTime <= futureTime);
01362 
01363     sotpRes = sotp_get(SOTP_TYPE_LAST_TIME_BACK, sizeof(updatedTime), (uint32_t*)&updatedTime, &actualSavedTimeSize);
01364     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01365     TEST_ASSERT_TRUE(updatedTime <= futureTime);
01366     #endif 
01367 }
01368 
01369 /**
01370 * @brief Test TLS handshake (TCP blocking) with near future time and validate that the handshake didn't update the device time (due to set time rules)
01371 *
01372 *
01373 * | # |    Step                        |   Expected  |
01374 * |---|--------------------------------|-------------|
01375 * | 1 | Get saved time from SOTP, move backward half day and set time to RAM    | PAL_SUCCESS |
01376 * | 2 | Create a TCP (blocking) socket.                                        | PAL_SUCCESS |
01377 * | 3 | Perform a DNS lookup on the server address.                                | PAL_SUCCESS |
01378 * | 4 | Set the server port.                                                     | PAL_SUCCESS |
01379 * | 5 | Parse the CA cert.                                                     | PAL_SUCCESS |
01380 * | 6 | Get the CA cert ID.                                                     | PAL_SUCCESS |
01381 * | 7 | Set the CA cert ID into the SOTP.                                            | PAL_SUCCESS |
01382 * | 8 | Connect the TCP socket to the server.                                        | PAL_SUCCESS |
01383 * | 9 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
01384 * | 10 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
01385 * | 11 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
01386 * | 12 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
01387 * | 13 | Set the socket to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
01388 * | 14 | Perform a TLS handshake with the server using `pal_handShake`.           | PAL_SUCCESS |
01389 * | 15 | Verify the handshake result using `pal_sslGetVerifyResult`.               | PAL_SUCCESS |
01390 * | 16 | Write data over open TLS connection using `pal_sslWrite`.            | PAL_SUCCESS |
01391 * | 17 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
01392 * | 18 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
01393 * | 19 | Free X509 Handle.                                                   | PAL_SUCCESS |
01394 * | 20 | Verify that the time was NOT updated during the handshake.                | PAL_SUCCESS |
01395 */
01396 TEST(pal_tls, tlsHandshakeTCP_FutureTrustedServer_NoTimeUpdate)
01397 {
01398     #if ((PAL_USE_SECURE_TIME == 1) && (PAL_USE_INTERNAL_FLASH == 1))
01399     palStatus_t status = PAL_SUCCESS;
01400     palTLSConfHandle_t palTLSConf = NULLPTR;
01401     palTLSHandle_t palTLSHandle = NULLPTR;
01402     palTLSTransportMode_t transportationMode = PAL_TLS_MODE;
01403     palSocketAddress_t socketAddr = { 0 };
01404     palSocketLength_t addressLength = 0;
01405     char serverResponse[PAL_TLS_MESSAGE_SIZE] = {0};
01406     uint32_t actualLen = 0;
01407     uint32_t written = 0;
01408     palX509_t pubKey = { (const void*)g_pubKey,sizeof(g_pubKey) };
01409     palPrivateKey_t prvKey = { (const void*)g_prvKey,sizeof(g_prvKey) };
01410     palTLSSocket_t tlsSocket = { g_socket, &socketAddr, 0, transportationMode };
01411     palX509_t caCert = { (const void*)pal_test_cas,sizeof(pal_test_cas) };
01412     sotp_result_e sotpRes = SOTP_SUCCESS;
01413     uint64_t currentTime = 0;
01414     uint64_t updatedTime = 0;
01415     uint16_t actualSavedTimeSize = 0;
01416     palX509Handle_t trustedServerCA = NULLPTR;
01417     int32_t verifyResult = 0;
01418 
01419     /*#1*/
01420     sotpRes = sotp_get(SOTP_TYPE_SAVED_TIME, sizeof(currentTime), (uint32_t*)&currentTime, &actualSavedTimeSize);
01421     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01422     TEST_ASSERT_TRUE(0 != currentTime);
01423 
01424     status = pal_osSetTime(currentTime - (PAL_SECONDS_PER_DAY / 2));//going back half day to simulate future server by half day (in order to prevent time update)
01425     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01426     /*#2*/
01427     status = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &g_socket);
01428     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01429     /*#3*/
01430     status = pal_getAddressInfo(PAL_TLS_TEST_SERVER_ADDRESS, &socketAddr, &addressLength);
01431     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01432     /*#4*/
01433     status = pal_setSockAddrPort(&socketAddr, TLS_RENEGOTIATE_SERVER_PORT);
01434     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01435 
01436     tlsSocket.addressLength = addressLength;
01437     tlsSocket.socket = g_socket;
01438     
01439     /*#5*/
01440     status = pal_x509Initiate(&trustedServerCA);
01441     TEST_ASSERT_NOT_EQUAL(trustedServerCA, NULLPTR);
01442     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01443 
01444     status = pal_x509CertParse(trustedServerCA, (const unsigned char *)pal_test_cas, sizeof(pal_test_cas));
01445     if (PAL_SUCCESS != status)
01446     {
01447         pal_x509Free(&trustedServerCA);
01448         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01449     }
01450     /*#6*/
01451     status = pal_x509CertGetAttribute(trustedServerCA, PAL_X509_CERT_ID_ATTR, g_trustedServerID, sizeof(g_trustedServerID), &g_actualServerIDSize);
01452     if (PAL_SUCCESS != status)
01453     {
01454         pal_x509Free(&trustedServerCA);
01455         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01456     }
01457     /*#7*/
01458     sotpRes = sotp_set(SOTP_TYPE_TRUSTED_TIME_SRV_ID, g_actualServerIDSize, (uint32_t*)g_trustedServerID);
01459     if (SOTP_SUCCESS != sotpRes)
01460     {
01461         pal_x509Free(&trustedServerCA);
01462         TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01463     }
01464 
01465     /*#8*/
01466     status = pal_connect(g_socket, &socketAddr, addressLength);
01467     if (PAL_SUCCESS != status)
01468     {
01469         pal_x509Free(&trustedServerCA);
01470         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01471     }
01472     /*#9*/
01473     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
01474     if (PAL_SUCCESS != status)
01475     {
01476         pal_x509Free(&trustedServerCA);
01477         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01478     }
01479     /*#10*/
01480     status = pal_initTLS(palTLSConf, &palTLSHandle);
01481     if (PAL_SUCCESS != status)
01482     {
01483         pal_freeTLS(&palTLSHandle);
01484         pal_tlsConfigurationFree(&palTLSConf);
01485         pal_x509Free(&trustedServerCA);
01486         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01487     }
01488 
01489     /*#11*/
01490     status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
01491     if (PAL_SUCCESS != status)
01492     {
01493         pal_freeTLS(&palTLSHandle);
01494         pal_tlsConfigurationFree(&palTLSConf);
01495         pal_x509Free(&trustedServerCA);
01496         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01497     }
01498     /*#12*/
01499     status = pal_setCAChain(palTLSConf, &caCert, NULL);
01500     if (PAL_SUCCESS != status)
01501     {
01502         pal_freeTLS(&palTLSHandle);
01503         pal_tlsConfigurationFree(&palTLSConf);
01504         pal_x509Free(&trustedServerCA);
01505         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01506     }
01507     /*#13*/
01508     status = pal_tlsSetSocket(palTLSConf, &tlsSocket);
01509     if (PAL_SUCCESS != status)
01510     {
01511         pal_freeTLS(&palTLSHandle);
01512         pal_tlsConfigurationFree(&palTLSConf);
01513         pal_x509Free(&trustedServerCA);
01514         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01515     }
01516     /*#14*/
01517     status = pal_handShake(palTLSHandle, palTLSConf);
01518     if (PAL_SUCCESS != status)
01519     {
01520         pal_freeTLS(&palTLSHandle);
01521         pal_tlsConfigurationFree(&palTLSConf);
01522         pal_x509Free(&trustedServerCA);
01523         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01524     }
01525     /*#15*/
01526     status = pal_sslGetVerifyResultExtended(palTLSHandle, &verifyResult);
01527     if (PAL_SUCCESS != status)
01528     {
01529         pal_freeTLS(&palTLSHandle);
01530         pal_tlsConfigurationFree(&palTLSConf);
01531         pal_x509Free(&trustedServerCA);
01532         TEST_ASSERT_TRUE(PAL_ERR_X509_BADCERT_EXPIRED & verifyResult);
01533     }
01534     /*#16*/
01535     status = pal_sslWrite(palTLSHandle, TLS_GET_REQUEST, sizeof(TLS_GET_REQUEST), &written);
01536     if (PAL_SUCCESS != status)
01537     {
01538         pal_freeTLS(&palTLSHandle);
01539         pal_tlsConfigurationFree(&palTLSConf);
01540         pal_x509Free(&trustedServerCA);
01541         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01542     }
01543 
01544     pal_osDelay(5000);
01545     /*#14*/
01546     status = pal_sslRead(palTLSHandle, serverResponse, PAL_TLS_MESSAGE_SIZE, &actualLen);
01547     if (PAL_SUCCESS != status)
01548     {
01549         pal_freeTLS(&palTLSHandle);
01550         pal_tlsConfigurationFree(&palTLSConf);
01551         pal_x509Free(&trustedServerCA);
01552         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01553     }
01554 
01555     /*#17*/
01556     status = pal_freeTLS(&palTLSHandle);
01557     if (PAL_SUCCESS != status)
01558     {
01559         pal_tlsConfigurationFree(&palTLSConf);
01560         pal_x509Free(&trustedServerCA);
01561         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01562     }
01563     /*#18*/
01564     status = pal_tlsConfigurationFree(&palTLSConf);
01565     if (PAL_SUCCESS != status)
01566     {
01567         pal_x509Free(&trustedServerCA);
01568         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01569     }
01570     /*#19*/
01571     status = pal_x509Free(&trustedServerCA);
01572     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01573 
01574     status = pal_close(&g_socket);
01575     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01576 
01577     /*#20*/ 
01578     sotpRes = sotp_get(SOTP_TYPE_SAVED_TIME, sizeof(updatedTime), (uint32_t*)&updatedTime, &actualSavedTimeSize);
01579     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01580     TEST_ASSERT_EQUAL_HEX(currentTime, updatedTime);
01581     #endif 
01582 
01583 }
01584 
01585 /**
01586 * @brief Test TLS handshake (TCP blocking) with near past time and validate that the handshake didn't update the device time (due to set time rules)
01587 *
01588 *
01589 * | # |    Step                        |   Expected  |
01590 * |---|--------------------------------|-------------|
01591 * | 1 | Get saved time from SOTP, move forward half day and set time to RAM    | PAL_SUCCESS |
01592 * | 2 | Create a TCP (blocking) socket.                                        | PAL_SUCCESS |
01593 * | 3 | Perform a DNS lookup on the server address.                                | PAL_SUCCESS |
01594 * | 4 | Set the server port.                                                     | PAL_SUCCESS |
01595 * | 5 | Parse the CA cert.                                                     | PAL_SUCCESS |
01596 * | 6 | Get the CA cert ID.                                                     | PAL_SUCCESS |
01597 * | 7 | Set the CA cert ID into the SOTP.                                            | PAL_SUCCESS |
01598 * | 8 | Connect the TCP socket to the server.                                        | PAL_SUCCESS |
01599 * | 9 | Initialize the TLS configuration using `pal_initTLSConfiguration`.         | PAL_SUCCESS |
01600 * | 10 | Initialize the TLS context using `pal_initTLS`.                            | PAL_SUCCESS |
01601 * | 11 | Set the certificate and keys to the configuration using `pal_setOwnCertAndPrivateKey`.| PAL_SUCCESS |
01602 * | 12 | Set the certificate chain to the configuration using `pal_setCAChain`.        | PAL_SUCCESS |
01603 * | 13 | Set the socket to the configuration using `pal_tlsSetSocket`.           | PAL_SUCCESS |
01604 * | 14 | Perform a TLS handshake with the server using `pal_handShake`.           | PAL_SUCCESS |
01605 * | 15 | Verify the handshake result using `pal_sslGetVerifyResult`.               | PAL_SUCCESS |
01606 * | 16 | Write data over open TLS connection using `pal_sslWrite`.            | PAL_SUCCESS |
01607 * | 17 | Uninitialize the TLS context using `pal_freeTLS`.                         | PAL_SUCCESS |
01608 * | 18 | Uninitialize the TLS configuration using `pal_tlsConfigurationFree`.      | PAL_SUCCESS |
01609 * | 19 | Free X509 handle.                                                     | PAL_SUCCESS |
01610 * | 20 | Verify that the time was NOT updated during the handshake.                | PAL_SUCCESS |
01611 */
01612 TEST(pal_tls, tlsHandshakeTCP_NearPastTrustedServer_NoTimeUpdate)
01613 {
01614     #if ((PAL_USE_SECURE_TIME == 1) && (PAL_USE_INTERNAL_FLASH == 1))
01615     palStatus_t status = PAL_SUCCESS;
01616     palTLSConfHandle_t palTLSConf = NULLPTR;
01617     palTLSHandle_t palTLSHandle = NULLPTR;
01618     palTLSTransportMode_t transportationMode = PAL_TLS_MODE;
01619     palSocketAddress_t socketAddr = { 0 };
01620     palSocketLength_t addressLength = 0;
01621     char serverResponse[PAL_TLS_MESSAGE_SIZE] = {0};
01622     uint32_t actualLen = 0;
01623     uint32_t written = 0;
01624     palX509_t pubKey = { (const void*)g_pubKey,sizeof(g_pubKey) };
01625     palPrivateKey_t prvKey = { (const void*)g_prvKey,sizeof(g_prvKey) };
01626     palTLSSocket_t tlsSocket = { g_socket, &socketAddr, 0, transportationMode };
01627     palX509_t caCert = { (const void*)pal_test_cas,sizeof(pal_test_cas) };
01628     sotp_result_e sotpRes = SOTP_SUCCESS;
01629     uint64_t currentTime = 0;
01630     uint64_t updatedTime = 0;
01631     uint16_t actualSavedTimeSize = 0;
01632     palX509Handle_t trustedServerCA = NULLPTR;
01633     int32_t verifyResult = 0;
01634 
01635     /*#1*/
01636     sotpRes = sotp_get(SOTP_TYPE_SAVED_TIME, sizeof(currentTime), (uint32_t*)&currentTime, &actualSavedTimeSize);
01637     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01638     TEST_ASSERT_TRUE(0 != currentTime);
01639 
01640     status = pal_osSetTime(currentTime + (PAL_SECONDS_PER_DAY / 2));//going back half day to simulate future server by half day (in order to prevent time update)
01641     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01642     /*#2*/
01643     status = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &g_socket);
01644     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01645     /*#3*/
01646     status = pal_getAddressInfo(PAL_TLS_TEST_SERVER_ADDRESS, &socketAddr, &addressLength);
01647     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01648     /*#4*/
01649     status = pal_setSockAddrPort(&socketAddr, TLS_RENEGOTIATE_SERVER_PORT);
01650     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01651 
01652     tlsSocket.addressLength = addressLength;
01653     tlsSocket.socket = g_socket;
01654 
01655     /*#5*/
01656     status = pal_x509Initiate(&trustedServerCA);
01657     TEST_ASSERT_NOT_EQUAL(trustedServerCA, NULLPTR);
01658     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01659 
01660     status = pal_x509CertParse(trustedServerCA, (const unsigned char *)pal_test_cas, sizeof(pal_test_cas));
01661     if (PAL_SUCCESS != status)
01662     {
01663         pal_x509Free(&trustedServerCA);
01664         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01665     }
01666     /*#6*/
01667     status = pal_x509CertGetAttribute(trustedServerCA, PAL_X509_CERT_ID_ATTR, g_trustedServerID, sizeof(g_trustedServerID), &g_actualServerIDSize);
01668     if (PAL_SUCCESS != status)
01669     {
01670         pal_x509Free(&trustedServerCA);
01671         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01672     }
01673     /*#7*/
01674     sotpRes = sotp_set(SOTP_TYPE_TRUSTED_TIME_SRV_ID, g_actualServerIDSize, (uint32_t*)g_trustedServerID);
01675     if (SOTP_SUCCESS != sotpRes)
01676     {
01677         pal_x509Free(&trustedServerCA);
01678         TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01679     }
01680 
01681     /*#8*/
01682     status = pal_connect(g_socket, &socketAddr, addressLength);
01683     if (PAL_SUCCESS != status)
01684     {
01685         pal_x509Free(&trustedServerCA);
01686         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01687     }
01688     /*#9*/
01689     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
01690     if (PAL_SUCCESS != status)
01691     {
01692         pal_x509Free(&trustedServerCA);
01693         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01694     }
01695     /*#10*/
01696     status = pal_initTLS(palTLSConf, &palTLSHandle);
01697     if (PAL_SUCCESS != status)
01698     {
01699         pal_freeTLS(&palTLSHandle);
01700         pal_tlsConfigurationFree(&palTLSConf);
01701         pal_x509Free(&trustedServerCA);
01702         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01703     }
01704 
01705     /*#11*/
01706     status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
01707     if (PAL_SUCCESS != status)
01708     {
01709         pal_freeTLS(&palTLSHandle);
01710         pal_tlsConfigurationFree(&palTLSConf);
01711         pal_x509Free(&trustedServerCA);
01712         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01713     }
01714     /*#12*/
01715     status = pal_setCAChain(palTLSConf, &caCert, NULL);
01716     if (PAL_SUCCESS != status)
01717     {
01718         pal_freeTLS(&palTLSHandle);
01719         pal_tlsConfigurationFree(&palTLSConf);
01720         pal_x509Free(&trustedServerCA);
01721         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01722     }
01723     /*#13*/
01724     status = pal_tlsSetSocket(palTLSConf, &tlsSocket);
01725     if (PAL_SUCCESS != status)
01726     {
01727         pal_freeTLS(&palTLSHandle);
01728         pal_tlsConfigurationFree(&palTLSConf);
01729         pal_x509Free(&trustedServerCA);
01730         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01731     }
01732     /*#14*/
01733     status = pal_handShake(palTLSHandle, palTLSConf);
01734     if (PAL_SUCCESS != status)
01735     {
01736         pal_freeTLS(&palTLSHandle);
01737         pal_tlsConfigurationFree(&palTLSConf);
01738         pal_x509Free(&trustedServerCA);
01739         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01740     }
01741     /*#15*/
01742     status = pal_sslGetVerifyResultExtended(palTLSHandle, &verifyResult);
01743     if (PAL_SUCCESS != status)
01744     {
01745         pal_freeTLS(&palTLSHandle);
01746         pal_tlsConfigurationFree(&palTLSConf);
01747         pal_x509Free(&trustedServerCA);
01748         TEST_ASSERT_TRUE(PAL_ERR_X509_BADCERT_EXPIRED & verifyResult);
01749     }
01750     /*#16*/
01751     status = pal_sslWrite(palTLSHandle, TLS_GET_REQUEST, sizeof(TLS_GET_REQUEST), &written);
01752     if (PAL_SUCCESS != status)
01753     {
01754         pal_freeTLS(&palTLSHandle);
01755         pal_tlsConfigurationFree(&palTLSConf);
01756         pal_x509Free(&trustedServerCA);
01757         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01758     }
01759 
01760     pal_osDelay(5000);
01761     /*#14*/
01762     status = pal_sslRead(palTLSHandle, serverResponse, PAL_TLS_MESSAGE_SIZE, &actualLen);
01763     if (PAL_SUCCESS != status)
01764     {
01765         pal_freeTLS(&palTLSHandle);
01766         pal_tlsConfigurationFree(&palTLSConf);
01767         pal_x509Free(&trustedServerCA);
01768         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01769     }
01770 
01771     /*#17*/
01772     status = pal_freeTLS(&palTLSHandle);
01773     if (PAL_SUCCESS != status)
01774     {
01775         pal_tlsConfigurationFree(&palTLSConf);
01776         pal_x509Free(&trustedServerCA);
01777         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01778     }
01779     /*#18*/
01780     status = pal_tlsConfigurationFree(&palTLSConf);
01781     if (PAL_SUCCESS != status)
01782     {
01783         pal_x509Free(&trustedServerCA);
01784         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01785     }
01786     /*#19*/
01787     status = pal_x509Free(&trustedServerCA);
01788     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01789 
01790     status = pal_close(&g_socket);
01791     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01792     /*#20*/ 
01793     sotpRes = sotp_get(SOTP_TYPE_SAVED_TIME, sizeof(updatedTime), (uint32_t*)&updatedTime, &actualSavedTimeSize);
01794     TEST_ASSERT_EQUAL_HEX(SOTP_SUCCESS, sotpRes);
01795     TEST_ASSERT_EQUAL_HEX(currentTime, updatedTime);
01796     #endif
01797 }
01798 
01799 #endif //PAL_USE_INTERNAL_FLASH
01800 
01801 static palStatus_t ThreadHandshakeTCPResource()
01802 {
01803 
01804     palStatus_t status = PAL_SUCCESS;
01805     palStatus_t mutexStatus = PAL_SUCCESS;
01806     palStatus_t tmpStatus = PAL_SUCCESS;
01807     palTLSConfHandle_t palTLSConf = NULLPTR;
01808     palTLSHandle_t palTLSHandle = NULLPTR;
01809     palTLSTransportMode_t transportationMode = PAL_TLS_MODE;
01810 
01811     mutexStatus = pal_osMutexWait(g_mutexHandShake1, PAL_RTOS_WAIT_FOREVER);
01812     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
01813 
01814     /*#1*/
01815     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
01816     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01817 
01818     /*#2*/
01819     status = pal_initTLS(palTLSConf, &palTLSHandle);
01820 
01821     mutexStatus = pal_osMutexRelease(g_mutexHandShake1);
01822     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
01823 
01824     pal_osDelay(800);
01825     if(PAL_SUCCESS == status)
01826     {
01827         tmpStatus = pal_freeTLS(&palTLSHandle);
01828         if (PAL_SUCCESS != tmpStatus)
01829         {
01830             PAL_LOG(ERR,"Expected: %d , Actual: %d , Line: %d\n", (int)PAL_SUCCESS, (int)tmpStatus, __LINE__);
01831         }
01832     }
01833 
01834     /*#16*/
01835     tmpStatus = pal_tlsConfigurationFree(&palTLSConf);
01836     if (PAL_SUCCESS != tmpStatus)
01837     {
01838         PAL_LOG(ERR,"Expected: %d , Actual: %d , Line: %d\n", (int)PAL_SUCCESS, (int)tmpStatus, __LINE__);
01839     }
01840 
01841     return status;
01842 }
01843 
01844 static palStatus_t ThreadHandshakeTCP(bool socketNonBlocking)
01845 {
01846     palStatus_t status = PAL_SUCCESS;
01847     palStatus_t tmpStatus = PAL_SUCCESS;
01848     palTLSConfHandle_t palTLSConf = NULLPTR;
01849     palTLSHandle_t palTLSHandle = NULLPTR;
01850     palTLSTransportMode_t transportationMode = PAL_TLS_MODE;
01851     palSocketAddress_t socketAddr = {0};
01852     palSocketLength_t addressLength = 0;
01853     char serverResponse[PAL_TLS_MESSAGE_SIZE] = {0};
01854     uint32_t actualLen = 0;
01855     uint32_t written = 0;
01856     palSocket_t socketTCP = 0;
01857     palX509_t pubKey = {(const void*)g_pubKey,sizeof(g_pubKey)};
01858     palPrivateKey_t prvKey = {(const void*)g_prvKey,sizeof(g_prvKey)};
01859     palTLSSocket_t tlsSocket = { socketTCP, &socketAddr, 0, transportationMode };
01860     palX509_t caCert = { (const void*)pal_test_cas,sizeof(pal_test_cas) };
01861     palTLSTest_t *testTLSCtx = NULL;
01862     palStatus_t mutexStatus = PAL_SUCCESS;
01863     bool mutexWait = false;
01864     int32_t verifyResult = 0;
01865 
01866 
01867     mutexStatus = pal_osMutexWait(g_mutexHandShake1, PAL_RTOS_WAIT_FOREVER);
01868     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
01869     mutexWait = true;
01870     /*#1*/
01871     status = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, socketNonBlocking, 0, &socketTCP);
01872     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01873     /*#2*/
01874     status = pal_getAddressInfo(PAL_TLS_TEST_SERVER_ADDRESS, &socketAddr, &addressLength);
01875     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01876 
01877     tlsSocket.addressLength = addressLength;
01878     tlsSocket.socket = socketTCP;
01879     /*#3*/
01880     if (true == socketNonBlocking)
01881     {
01882         status = pal_setSockAddrPort(&socketAddr, TLS_SERVER_PORT_NB);
01883         PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01884     }
01885     else //blocking
01886     {
01887         status = pal_setSockAddrPort(&socketAddr, TLS_SERVER_PORT);
01888         PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01889     }
01890 
01891     /*#4*/
01892     status = pal_connect(socketTCP, &socketAddr, addressLength);
01893     if (PAL_ERR_SOCKET_IN_PROGRES  == status)
01894     {
01895         pal_osDelay(400);
01896     }
01897     else
01898     {
01899         PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01900     }
01901     /*#5*/
01902     status = pal_initTLSConfiguration(&palTLSConf, transportationMode);
01903     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01904     TEST_ASSERT_NOT_EQUAL(palTLSConf, NULLPTR);
01905     /*#6*/
01906     status = pal_initTLS(palTLSConf, &palTLSHandle);
01907     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01908 
01909     // This code commented out to prevent massive prints from mbedTLS, if you want to see logs from client side, just uncomment them.
01910     //status = pal_sslDebugging(true);
01911     //TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
01912     /*#7*/
01913     status = pal_setOwnCertAndPrivateKey(palTLSConf, &pubKey, &prvKey);
01914     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01915     /*#8*/
01916     status = pal_setCAChain(palTLSConf, &caCert, NULL);
01917     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01918     /*#9*/
01919     status = pal_tlsSetSocket(palTLSConf, &tlsSocket);
01920     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01921     /*#10*/
01922     testTLSCtx = (palTLSTest_t*)palTLSHandle; //This casting is done to sign that we are in retry situation.
01923     if (true == socketNonBlocking)
01924     {
01925         PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status); // More than current epoch time -> success
01926         do
01927         {
01928             if (testTLSCtx->retryHandShake && !g_retryHandshake)
01929             {
01930                 g_retryHandshake = true;
01931                 if (mutexWait)
01932                 {
01933                     mutexStatus = pal_osMutexRelease(g_mutexHandShake1);
01934                     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
01935                     mutexWait = false;
01936                     pal_osDelay(100);
01937                 }
01938             }
01939             status = pal_handShake(palTLSHandle, palTLSConf);
01940         }
01941         while ( (PAL_ERR_TLS_WANT_READ == status) || (PAL_ERR_TLS_WANT_WRITE == status));
01942     }
01943     else //blocking
01944     {
01945         status = pal_handShake(palTLSHandle, palTLSConf);
01946     }
01947     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01948 
01949     /*#11*/
01950     status = pal_sslGetVerifyResultExtended(palTLSHandle, &verifyResult);
01951     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01952     /*#12*/
01953     status = pal_sslWrite(palTLSHandle, TLS_GET_REQUEST, sizeof(TLS_GET_REQUEST), &written);
01954     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01955     /*#13*/
01956     pal_osDelay(5000);
01957 
01958     /*#14*/
01959     status = pal_sslRead(palTLSHandle, serverResponse, PAL_TLS_MESSAGE_SIZE, &actualLen);
01960     PAL_TLS_INT32_CHECK_NOT_EQUAL_GOTO_FINISH(PAL_SUCCESS, status);
01961 
01962 finish:
01963     if (mutexWait)
01964     {
01965         mutexStatus = pal_osMutexRelease(g_mutexHandShake1);
01966         TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
01967     }
01968     /*#15*/
01969     tmpStatus = pal_freeTLS(&palTLSHandle);
01970     if (PAL_SUCCESS != tmpStatus)
01971     {
01972         PAL_LOG(ERR,"Expected: %d , Actual: %d , Line: %d\n", (int)PAL_SUCCESS, (int)tmpStatus, __LINE__);
01973     }
01974     /*#16*/
01975     tmpStatus = pal_tlsConfigurationFree(&palTLSConf);
01976     if (PAL_SUCCESS != tmpStatus)
01977     {
01978         PAL_LOG(ERR,"Expected: %d , Actual: %d , Line: %d\n", (int)PAL_SUCCESS, (int)tmpStatus, __LINE__);
01979     }
01980     /*#17*/
01981     tmpStatus = pal_close(&socketTCP);
01982     if (PAL_SUCCESS != tmpStatus)
01983     {
01984         PAL_LOG(ERR,"Expected: %d , Actual: %d , Line: %d\n", (int)PAL_SUCCESS, (int)tmpStatus, __LINE__);
01985     }
01986     if (PAL_SUCCESS == status)
01987     {
01988         status = tmpStatus;
01989     }
01990     return status;
01991 
01992 }
01993 
01994 void pal_TCPHandshakeFunc1(void const *argument)
01995 {
01996     palStatus_t mutexStatus = PAL_SUCCESS;
01997     palStatus_t* arg = (palStatus_t*)argument;
01998     mutexStatus = pal_osMutexWait(g_mutex1, PAL_RTOS_WAIT_FOREVER);
01999     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
02000 
02001     *arg = ThreadHandshakeTCPResource();
02002 
02003     mutexStatus = pal_osMutexRelease(g_mutex1);
02004     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
02005 }
02006 
02007 void pal_TCPHandshakeFunc2(void const *argument)
02008 {
02009     palStatus_t mutexStatus = PAL_SUCCESS;
02010     palStatus_t* arg = (palStatus_t*)argument;
02011     mutexStatus = pal_osMutexWait(g_mutex2, PAL_RTOS_WAIT_FOREVER);
02012     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
02013 
02014     *arg = ThreadHandshakeTCPResource();
02015 
02016     mutexStatus = pal_osMutexRelease(g_mutex2);
02017     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
02018 }
02019 
02020 
02021 void pal_TCPHandshakeFunc3(void const *argument)
02022 {
02023     palStatus_t mutexStatus = PAL_SUCCESS;
02024     palStatus_t* arg = (palStatus_t*)argument;
02025     mutexStatus = pal_osMutexWait(g_mutex1, PAL_RTOS_WAIT_FOREVER);
02026     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
02027     *arg = ThreadHandshakeTCP(true);
02028 
02029     mutexStatus = pal_osMutexRelease(g_mutex1);
02030     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
02031 }
02032 
02033 void pal_CertVerify(void const *argument)
02034 {
02035 #if (PAL_ENABLE_X509 == 1)
02036     palStatus_t status = PAL_SUCCESS;
02037     palStatus_t mutexStatus = PAL_SUCCESS;
02038     palStatus_t* arg = (palStatus_t*)argument;
02039     palX509Handle_t certHandle = NULLPTR;
02040     int32_t verifyResult = 0;
02041 
02042     mutexStatus = pal_osMutexWait(g_mutexHandShake1, PAL_RTOS_WAIT_FOREVER);
02043     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
02044 
02045     status = pal_osMutexWait(g_mutex2, PAL_RTOS_WAIT_FOREVER);
02046     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02047 
02048     status = pal_x509Initiate(&certHandle);
02049     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02050 
02051     status = pal_x509CertParse(certHandle, (const void*)pal_test_cas, sizeof(pal_test_cas));
02052     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02053 
02054     PAL_LOG(INFO,"Calling Cert Verify..");
02055     *arg = pal_x509CertVerifyExtended(certHandle, certHandle, &verifyResult);
02056     TEST_ASSERT_TRUE(PAL_ERR_X509_BADCERT_FUTURE & verifyResult);
02057     
02058     pal_x509Free(&certHandle);
02059 
02060     mutexStatus = pal_osMutexRelease(g_mutexHandShake1);
02061     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
02062 
02063     mutexStatus = pal_osMutexRelease(g_mutex2);
02064     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, mutexStatus);
02065 #endif
02066 }
02067 
02068 static void runTLSThreadTest(palThreadFuncPtr func1, palThreadFuncPtr func2, palStatus_t test1Result, palStatus_t test2Result)
02069 {
02070     palStatus_t status = PAL_SUCCESS;
02071     palThreadID_t threadID1 = NULLPTR;
02072     palThreadID_t threadID2 = NULLPTR;
02073     palStatus_t tlsArgs1 = PAL_SUCCESS;
02074     palStatus_t tlsArgs2 = PAL_SUCCESS;
02075 
02076     status = pal_osMutexCreate(&g_mutexHandShake1);
02077     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02078 
02079     status = pal_osMutexCreate(&g_mutex1);
02080     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02081 
02082     status = pal_osMutexCreate(&g_mutex2);
02083     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02084 
02085     status = pal_osThreadCreateWithAlloc(func1, &tlsArgs1, PAL_osPriorityHigh , 5*PAL_TEST_THREAD_STACK_SIZE, NULL, &threadID1);
02086     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02087 
02088     status = pal_osThreadCreateWithAlloc(func2, &tlsArgs2, PAL_osPriorityAboveNormal, 5*PAL_TEST_THREAD_STACK_SIZE, NULL, &threadID2);
02089     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02090 
02091     status = pal_osMutexWait(g_mutex1, PAL_RTOS_WAIT_FOREVER);
02092     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02093 
02094     status = pal_osMutexWait(g_mutex2, PAL_RTOS_WAIT_FOREVER);
02095     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02096 
02097     status = pal_osThreadTerminate(&threadID1);
02098     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02099 
02100     status = pal_osThreadTerminate(&threadID2);
02101     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02102 
02103     status = pal_osMutexRelease(g_mutex1);
02104     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02105 
02106     status = pal_osMutexRelease(g_mutex2);
02107     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02108 
02109     status = pal_osMutexDelete(&g_mutex1);
02110     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02111 
02112     status = pal_osMutexDelete(&g_mutex2);
02113     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02114 
02115     status = pal_osMutexDelete(&g_mutexHandShake1);
02116     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02117 
02118     TEST_ASSERT_EQUAL_HEX(test1Result, tlsArgs1);
02119     TEST_ASSERT_EQUAL_HEX(test2Result, tlsArgs2);
02120 }
02121 
02122 
02123 /**
02124 * @brief Test try to process multiple handshake in the same time over different threads (second handhsake MUST fail)
02125 *
02126 *
02127 * | # |    Step                        |   Expected  |
02128 * |---|--------------------------------|-------------|
02129 * | 1 | Create Thread1 to process DTLS handshake                | PAL_SUCCESS |
02130 * | 1 | Create Thread2 to process TLS handshake                 | PAL_ERR_TLS_RESOURCE |
02131 */
02132 TEST(pal_tls, parallelTCPHandshakes_threads)
02133 {
02134     runTLSThreadTest(pal_TCPHandshakeFunc1, pal_TCPHandshakeFunc2, PAL_SUCCESS, PAL_ERR_TLS_RESOURCE);
02135 }
02136 
02137 /**
02138 * @brief Test try to process certificate verification with future certificate validation time while processing handshake
02139 *        in another thread to update the device time, we need to check that certificate verification is done against the 
02140 *        broken device time (0) and after handshake is done, we need to re-verify against the fixed time according to the
02141 *        server time sent by the server during handshake.
02142 *
02143 *
02144 * | # |    Step                        |   Expected  |
02145 * |---|--------------------------------|-------------|
02146 * | 1 | Create Thread1 to process DTLS handshake                | PAL_SUCCESS |
02147 * | 1 | Create Thread2 to process TLS handshake                 | PAL_ERR_X509_CERT_VERIFY_FAILED |
02148 */
02149 TEST(pal_tls, TCPHandshakeWhileCertVerify_threads)
02150 {
02151     #if (PAL_USE_SECURE_TIME == 1)
02152     palStatus_t status = PAL_SUCCESS;
02153     palX509Handle_t certHandle = NULLPTR;
02154     uint64_t systemTime = 0;
02155 
02156     status = pal_osSetTime(0);
02157     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02158 
02159     runTLSThreadTest(pal_TCPHandshakeFunc3, pal_CertVerify, PAL_SUCCESS, PAL_ERR_X509_CERT_VERIFY_FAILED);
02160 
02161     systemTime = pal_osGetTime();
02162     TEST_ASSERT_TRUE(0 < systemTime);
02163 
02164     status = pal_x509Initiate(&certHandle);
02165     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02166 
02167     status = pal_x509CertParse(certHandle, (const void*)pal_test_cas, sizeof(pal_test_cas));
02168     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02169 
02170     status = pal_x509CertVerify(certHandle, certHandle);
02171     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02172 
02173     status = pal_x509Free(&certHandle);
02174     TEST_ASSERT_EQUAL_HEX(PAL_SUCCESS, status);
02175     #endif
02176 }
02177 
02178 
02179 
02180 
02181 
02182 
02183 
02184