1 /* This test is to cover nx_secure_tls_process_serverhello.c.  */
2 
3 #include   "tx_api.h"
4 #include   "nx_api.h"
5 #include   "nx_tcp.h"
6 #include   "nx_crypto_rsa.h"
7 #include   "nx_secure_tls_api.h"
8 #include   "tls_test_utility.h"
9 
10 extern void    test_control_return(UINT status);
11 
12 #if !defined(NX_SECURE_TLS_CLIENT_DISABLED) && !defined(NX_SECURE_TLS_SERVER_DISABLED) && !defined(NX_SECURE_DISABLE_X509)
13 #define __LINUX__
14 
15 /* Define the ThreadX and NetX object control blocks...  */
16 
17 static TX_THREAD               ntest_0;
18 static TX_THREAD               ntest_1;
19 
20 static NX_PACKET_POOL          pool_0;
21 static NX_PACKET_POOL          pool_1;
22 static NX_IP                   ip_0;
23 static NX_IP                   ip_1;
24 static NX_TCP_SOCKET           client_socket;
25 static NX_TCP_SOCKET           server_socket;
26 static NX_SECURE_TLS_SESSION   client_tls_session;
27 static NX_SECURE_TLS_SESSION   server_tls_session;
28 
29 static NX_SECURE_X509_CERT certificate;
30 static NX_SECURE_X509_CERT ica_certificate;
31 static NX_SECURE_X509_CERT client_certificate;
32 static NX_SECURE_X509_CERT remote_certificate, remote_issuer;
33 static NX_SECURE_X509_CERT client_remote_certificate, client_remote_issuer;
34 static NX_SECURE_X509_CERT trusted_certificate;
35 
36 static UCHAR remote_cert_buffer[2000];
37 static UCHAR remote_issuer_buffer[2000];
38 static UCHAR client_remote_cert_buffer[2000];
39 static UCHAR client_remote_issuer_buffer[2000];
40 
41 static UCHAR server_packet_buffer[4000];
42 static UCHAR client_packet_buffer[4000];
43 
44 static CHAR server_crypto_metadata[16000];
45 static CHAR client_crypto_metadata[16000];
46 
47 /* Test PKI (3-level). */
48 #include "test_ca_cert.c"
49 #include "tls_two_test_certs.c"
50 #define ca_cert_der test_ca_cert_der
51 #define ca_cert_der_len test_ca_cert_der_len
52 
53 /*  Cryptographic routines. */
54 extern NX_SECURE_TLS_CRYPTO nx_crypto_tls_ciphers;
55 extern NX_SECURE_TLS_CIPHERSUITE_INFO _nx_crypto_ciphersuite_lookup_table[];
56 
57 #define     DEMO_STACK_SIZE  4096 //  (3 * 1024 / sizeof(ULONG))
58 
59 /* Define the IP thread's stack area.  */
60 #define IP_STACK_SIZE 4096 //(2 * 1024 / sizeof(ULONG))
61 
62 /* Define packet pool for the demonstration.  */
63 #define NX_PACKET_POOL_BYTES  ((1536 + sizeof(NX_PACKET)) * 20)
64 #define NX_PACKET_POOL_SIZE (NX_PACKET_POOL_BYTES/sizeof(ULONG) + 64 / sizeof(ULONG))
65 
66 /* Define the ARP cache area.  */
67 #define ARP_AREA_SIZE 1024 // (512 / sizeof(ULONG))
68 
69 #define TOTAL_STACK_SPACE (2 * (DEMO_STACK_SIZE + IP_STACK_SIZE + NX_PACKET_POOL_SIZE + ARP_AREA_SIZE))
70 
71 #ifndef __LINUX__
72 ULONG test_stack_area[TOTAL_STACK_SPACE + 2000];
73 #endif
74 
75 static ULONG pool_area[2][NX_PACKET_POOL_SIZE];
76 
77 /* Define thread prototypes.  */
78 
79 static void    ntest_0_entry(ULONG thread_input);
80 static void    ntest_1_entry(ULONG thread_input);
81 extern void    _nx_ram_network_driver_1500(struct NX_IP_DRIVER_STRUCT *driver_req);
82 
83 /* Define what the initial system looks like.  */
84 #ifndef __LINUX__
tx_application_define(void * first_unused_memory)85 void tx_application_define(void *first_unused_memory)
86 #else
87 #ifdef CTEST
88 void test_application_define(void *first_unused_memory);
89 void test_application_define(void *first_unused_memory)
90 #else
91 void nx_secure_tls_serverhello_coverage_test_application_define(void *first_unused_memory)
92 #endif
93 #endif
94 {
95 CHAR       *pointer;
96 UINT       status;
97 
98     /* Setup the working pointer.  */
99 #ifndef __LINUX__
100     pointer = (CHAR*)test_stack_area;
101 #else
102     pointer = (CHAR *) first_unused_memory;
103 #endif
104 
105     /* Create the main thread.  */
106     tx_thread_create(&ntest_0, "thread 0", ntest_0_entry, 0,
107                      pointer, DEMO_STACK_SIZE,
108                      3, 3, TX_NO_TIME_SLICE, TX_AUTO_START);
109 
110     pointer = pointer + DEMO_STACK_SIZE;
111 
112     /* Create the main thread.  */
113     tx_thread_create(&ntest_1, "thread 1", ntest_1_entry, 0,
114                      pointer, DEMO_STACK_SIZE,
115                      4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
116 
117     pointer = pointer + DEMO_STACK_SIZE;
118 
119     /* Initialize the NetX system.  */
120     nx_system_initialize();
121 
122     /* Create a packet pool.  */
123     status = nx_packet_pool_create(&pool_0, "NetX Main Packet Pool", 1536, pool_area[0], sizeof(pool_area[0]));
124     EXPECT_EQ(NX_SUCCESS, status);
125 
126     /* Create a packet pool.  */
127     status = nx_packet_pool_create(&pool_1, "NetX Main Packet Pool", 1536, pool_area[1], sizeof(pool_area[1]));
128     EXPECT_EQ(NX_SUCCESS, status);
129 
130     /* Create an IP instance.  */
131     status = nx_ip_create(&ip_0, "NetX IP Instance 0", IP_ADDRESS(1, 2, 3, 4), 0xFFFFFF00UL, &pool_0, _nx_ram_network_driver_1500,
132                           pointer, IP_STACK_SIZE, 1);
133     pointer = pointer + IP_STACK_SIZE;
134 
135     /* Create another IP instance.  */
136     status += nx_ip_create(&ip_1, "NetX IP Instance 1", IP_ADDRESS(1, 2, 3, 5), 0xFFFFFF00UL, &pool_1, _nx_ram_network_driver_1500,
137                            pointer, IP_STACK_SIZE, 1);
138     pointer = pointer + IP_STACK_SIZE;
139     EXPECT_EQ(NX_SUCCESS, status);
140 
141     /* Enable ARP and supply ARP cache memory for IP Instance 0.  */
142     status = nx_arp_enable(&ip_0, (void *) pointer, ARP_AREA_SIZE);
143     pointer = pointer + ARP_AREA_SIZE;
144 
145     /* Enable ARP and supply ARP cache memory for IP Instance 1.  */
146     status += nx_arp_enable(&ip_1, (void *) pointer, ARP_AREA_SIZE);
147     pointer = pointer + ARP_AREA_SIZE;
148     EXPECT_EQ(NX_SUCCESS, status);
149 
150     /* Enable TCP processing for both IP instances.  */
151     status = nx_tcp_enable(&ip_0);
152     status += nx_tcp_enable(&ip_1);
153     EXPECT_EQ(NX_SUCCESS, status);
154 
155     nx_secure_tls_initialize();
156 }
157 
158 /*  Define callbacks used by TLS.  */
159 /* Include CRL associated with Verisign root CA (for AWS) for demo purposes. */
160 #include "test_ca.crl.der.c"
161 
162 /* Test packets.  */
163 /* Message size < 38.  */
164 static UCHAR server_hello_test_1[] = {
165 0x03, 0x03, 0x2f, 0xda, 0xe5, 0x9b, 0x11,
166 0xdc, 0x13, 0x74, 0x31, 0xb5, 0x5d, 0xcf, 0x37, 0xe4, 0xb0, 0x5c, 0x06, 0x5c, 0x11, 0x74, 0xe1,
167 0x72, 0xfd, 0x7c, 0xd0, 0xce, 0x3f, 0x66, 0x54, 0x06, 0x4d, 0xa1, 0x00, 0xc0, 0x2c,
168 };
169 
170 /* Invalid seesion_id length.  */
171 static UCHAR server_hello_test_2[] = {
172 0x03, 0x03, 0x2f, 0xda, 0xe5, 0x9b, 0x11,
173 0xdc, 0x13, 0x74, 0x31, 0xb5, 0x5d, 0xcf, 0x37, 0xe4, 0xb0, 0x5c, 0x06, 0x5c, 0x11, 0x74, 0xe1,
174 0x72, 0xfd, 0x7c, 0xd0, 0xce, 0x3f, 0x66, 0x54, 0x06, 0x4d, 0xa1, 0x30, 0xf1, 0xf2, 0xc0, 0x2c, 0x00, 0x00,
175 0x15, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x04, 0x03, 0x00, 0x01, 0x02, 0x00, 0x23,
176 0x00, 0x00, 0x00, 0x17, 0x00, 0x00
177 };
178 
179 /* Unknow ciphersuite.  */
180 static UCHAR server_hello_test_3[] = {
181 0x03, 0x03, 0x2f, 0xda, 0xe5, 0x9b, 0x11,
182 0xdc, 0x13, 0x74, 0x31, 0xb5, 0x5d, 0xcf, 0x37, 0xe4, 0xb0, 0x5c, 0x06, 0x5c, 0x11, 0x74, 0xe1,
183 0x72, 0xfd, 0x7c, 0xd0, 0xce, 0x3f, 0x66, 0x54, 0x06, 0x4d, 0xa1, 0x02, 0xf1, 0xf2, 0xc0, 0x2c, 0x00, 0x00,
184 0x15, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x04, 0x03, 0x00, 0x01, 0x02, 0x00, 0x23,
185 0x00, 0x00, 0x00, 0x17, 0x00, 0x00
186 };
187 
188 /* No supported compression methods. */
189 static UCHAR server_hello_test_4[] = {
190 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x18, 0x00, 0x00, 0x84, 0x67,
191 0x00, 0x00, 0xe1, 0x4a, 0x00, 0x00, 0x6c, 0x3d, 0x00, 0x00, 0xd6, 0x2c, 0x00, 0x00, 0xae, 0x72,
192 0x00, 0x00, 0x52, 0x69, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x01, 0x00, 0x05, 0xff, 0x01, 0x00, 0x01,
193 0x00
194 };
195 
196 /* Invalid extension length. */
197 static UCHAR server_hello_test_5[] = {
198 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x18, 0x00, 0x00, 0x84, 0x67,
199 0x00, 0x00, 0xe1, 0x4a, 0x00, 0x00, 0x6c, 0x3d, 0x00, 0x00, 0xd6, 0x2c, 0x00, 0x00, 0xae, 0x72,
200 0x00, 0x00, 0x52, 0x69, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xff, 0x01, 0x00, 0x01,
201 0x00
202 };
203 
204 /* nx_secure_tls_session_client_callback return error status. */
205 static UCHAR server_hello_test_6[] = {
206 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x18, 0x00, 0x00, 0x84, 0x67,
207 0x00, 0x00, 0xe1, 0x4a, 0x00, 0x00, 0x6c, 0x3d, 0x00, 0x00, 0xd6, 0x2c, 0x00, 0x00, 0xae, 0x72,
208 0x00, 0x00, 0x52, 0x69, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x05, 0xff, 0x01, 0x00, 0x01,
209 0x00
210 };
211 
212 /* Cover if (message_length >= (length + 2)). */
213 static UCHAR server_hello_test_7[] = {
214 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x18, 0x00, 0x00, 0x84, 0x67,
215 0x00, 0x00, 0xe1, 0x4a, 0x00, 0x00, 0x6c, 0x3d, 0x00, 0x00, 0xd6, 0x2c, 0x00, 0x00, 0xae, 0x72,
216 0x00, 0x00, 0x52, 0x69, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00
217 };
218 
219 /* nx_secure_tls_process_serverhello_extensions.c */
220 static UCHAR server_hello_reneg[] = {
221 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x18, 0x00, 0x00, 0x84, 0x67,
222 0x00, 0x00, 0xe1, 0x4a, 0x00, 0x00, 0x6c, 0x3d, 0x00, 0x00, 0xd6, 0x2c, 0x00, 0x00, 0xae, 0x72,
223 0x00, 0x00, 0x52, 0x69, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x05, 0xff, 0x01, 0x00, 0x01,
224 0x00
225 };
226 
227 /* if (offset + 4 > message_length) */
228 static UCHAR server_hello_test_8[] = {
229 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x18, 0x00, 0x00, 0x84, 0x67,
230 0x00, 0x00, 0xe1, 0x4a, 0x00, 0x00, 0x6c, 0x3d, 0x00, 0x00, 0xd6, 0x2c, 0x00, 0x00, 0xae, 0x72,
231 0x00, 0x00, 0x52, 0x69, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x03, 0xff, 0x01, 0x00, 0x01,
232 0x00
233 };
234 
235 #ifndef NX_SECURE_TLS_DISABLE_SECURE_RENEGOTIATION
236 /* if (*extension_length > message_length || *extension_length < 3) */
237 static UCHAR server_hello_test_9[] = {
238 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x18, 0x00, 0x00, 0x84, 0x67,
239 0x00, 0x00, 0xe1, 0x4a, 0x00, 0x00, 0x6c, 0x3d, 0x00, 0x00, 0xd6, 0x2c, 0x00, 0x00, 0xae, 0x72,
240 0x00, 0x00, 0x52, 0x69, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x05, 0xff, 0x01, 0x00, 0x00,
241 0x00
242 };
243 
244 /* if (*extension_length > message_length || *extension_length < 3) */
245 static UCHAR server_hello_test_10[] = {
246 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x18, 0x00, 0x00, 0x84, 0x67,
247 0x00, 0x00, 0xe1, 0x4a, 0x00, 0x00, 0x6c, 0x3d, 0x00, 0x00, 0xd6, 0x2c, 0x00, 0x00, 0xae, 0x72,
248 0x00, 0x00, 0x52, 0x69, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x05, 0xff, 0x01, 0x00, 0x02,
249 0x00
250 };
251 
252 /* if (*extension_length > message_length || *extension_length < 3) */
253 static UCHAR server_hello_test_11[] = {
254 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x18, 0x00, 0x00, 0x84, 0x67,
255 0x00, 0x00, 0xe1, 0x4a, 0x00, 0x00, 0x6c, 0x3d, 0x00, 0x00, 0xd6, 0x2c, 0x00, 0x00, 0xae, 0x72,
256 0x00, 0x00, 0x52, 0x69, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x05, 0xff, 0x01, 0x00, 0x01,
257 0x01
258 };
259 
260 static UCHAR server_hello_test_12[] = {
261 0xff, 0x01, 0x00, 0x19,
262 0x18, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x01, 0x02, 0x03, 0x04,
263 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
264 };
265 
266 static UCHAR server_hello_test_13[] = {
267 0xff, 0x01, 0x00, 0x19,
268 0x17, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x01, 0x02, 0x03, 0x04,
269 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
270 };
271 
272 static UCHAR server_hello_test_14[] = {
273 0xff, 0x01, 0x00, 0x02, 0x00, 0x00
274 };
275 
276 static UCHAR server_hello_test_15[] = {
277 0xff, 0x01, 0x00, 0x01, 0x00
278 };
279 #endif
280 
281 /* Set test packets' info.  */
282 static UCHAR *test_packets_data[] = {
283 server_hello_test_1,
284 server_hello_test_2,
285 server_hello_test_3,
286 server_hello_test_4,
287 server_hello_test_5,
288 server_hello_test_6,
289 server_hello_test_7,
290 server_hello_test_8,
291 #ifndef NX_SECURE_TLS_DISABLE_SECURE_RENEGOTIATION
292 server_hello_test_9,
293 server_hello_test_10,
294 server_hello_test_11,
295 #endif
296 };
297 
298 static UINT test_packets_size[] = {
299 sizeof(server_hello_test_1),
300 sizeof(server_hello_test_2),
301 sizeof(server_hello_test_3),
302 sizeof(server_hello_test_4),
303 sizeof(server_hello_test_5),
304 sizeof(server_hello_test_6),
305 sizeof(server_hello_test_7),
306 sizeof(server_hello_test_8),
307 #ifndef NX_SECURE_TLS_DISABLE_SECURE_RENEGOTIATION
308 sizeof(server_hello_test_9),
309 sizeof(server_hello_test_10),
310 sizeof(server_hello_test_11),
311 #endif
312 };
313 
314 /* Set expected status.  */
315 static UINT test_status[] = {
316 NX_SECURE_TLS_INCORRECT_MESSAGE_LENGTH,
317 NX_SECURE_TLS_INCORRECT_MESSAGE_LENGTH,
318 NX_SECURE_TLS_UNKNOWN_CIPHERSUITE,
319 NX_SECURE_TLS_BAD_COMPRESSION_METHOD,
320 NX_SECURE_TLS_INCORRECT_MESSAGE_LENGTH,
321 111,
322 NX_NO_PACKET,
323 NX_SECURE_TLS_INCORRECT_MESSAGE_LENGTH,
324 #ifndef NX_SECURE_TLS_DISABLE_SECURE_RENEGOTIATION
325 NX_SECURE_TLS_INCORRECT_MESSAGE_LENGTH,
326 NX_SECURE_TLS_INCORRECT_MESSAGE_LENGTH,
327 NX_SECURE_TLS_INCORRECT_MESSAGE_LENGTH,
328 #endif
329 };
330 
331 #define TEST_START 0
332 
test_callback(NX_SECURE_TLS_SESSION * tls_session,NX_SECURE_TLS_HELLO_EXTENSION * extensions,UINT num_extensions)333 static ULONG test_callback(NX_SECURE_TLS_SESSION *tls_session, NX_SECURE_TLS_HELLO_EXTENSION *extensions, UINT num_extensions)
334 {
335     return 111;
336 }
337 
338 /* -----===== SERVER =====----- */
339 
ntest_0_entry(ULONG thread_input)340 static void    ntest_0_entry(ULONG thread_input)
341 {
342 UINT       status, i;
343 ULONG      actual_status;
344 NX_PACKET *send_packet, *receive_packet;
345 
346     /* Print out test information banner.  */
347     printf("NetX Secure Test:   TLS ServeHello Coverage Test.......................");
348 
349     /* Ensure the IP instance has been initialized.  */
350     status = nx_ip_status_check(&ip_0, NX_IP_INITIALIZE_DONE, &actual_status, NX_IP_PERIODIC_RATE);
351     EXPECT_EQ(NX_SUCCESS, status);
352 
353     /* Create a socket.  */
354     status = nx_tcp_socket_create(&ip_0, &server_socket, "Server Socket",
355                                   NX_IP_NORMAL, NX_FRAGMENT_OKAY, NX_IP_TIME_TO_LIVE * 100, 16*1024,
356                                   NX_NULL, NX_NULL);
357     EXPECT_EQ(NX_SUCCESS, status);
358 
359     /* Create a TLS session for our socket.  */
360     status =  nx_secure_tls_session_create(&server_tls_session,
361                                            &nx_crypto_tls_ciphers,
362                                            server_crypto_metadata,
363                                            sizeof(server_crypto_metadata));
364     EXPECT_EQ(NX_SUCCESS, status);
365 
366     /* Setup our packet reassembly buffer. */
367     nx_secure_tls_session_packet_buffer_set(&server_tls_session, server_packet_buffer, sizeof(server_packet_buffer));
368 
369     /* Enable Client Certificate Verification. */
370     nx_secure_tls_session_client_verify_enable(&server_tls_session);
371 
372     /* Initialize our certificate. */
373     nx_secure_x509_certificate_initialize(&certificate, test_device_cert_der, test_device_cert_der_len, NX_NULL, 0, test_device_cert_key_der, test_device_cert_key_der_len, NX_SECURE_X509_KEY_TYPE_RSA_PKCS1_DER);
374     nx_secure_tls_local_certificate_add(&server_tls_session, &certificate);
375 
376     nx_secure_x509_certificate_initialize(&ica_certificate, ica_cert_der, ica_cert_der_len, NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
377     nx_secure_tls_local_certificate_add(&server_tls_session, &ica_certificate);
378 
379     /* If we are testing client certificate verify, allocate remote certificate space. */
380     nx_secure_tls_remote_certificate_allocate(&server_tls_session, &client_remote_certificate, client_remote_cert_buffer, sizeof(client_remote_cert_buffer));
381     nx_secure_tls_remote_certificate_allocate(&server_tls_session, &client_remote_issuer, client_remote_issuer_buffer, sizeof(client_remote_issuer_buffer));
382 
383     /* Add a CA Certificate to our trusted store for verifying incoming client certificates. */
384     nx_secure_x509_certificate_initialize(&trusted_certificate, ca_cert_der, ca_cert_der_len, NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
385     nx_secure_tls_trusted_certificate_add(&server_tls_session, &trusted_certificate);
386 
387     /* Initialize server session manually. */
388     server_tls_session.nx_secure_tls_tcp_socket = &server_socket;
389     server_tls_session.nx_secure_tls_packet_pool = &pool_0;
390     server_tls_session.nx_secure_tls_protocol_version = NX_SECURE_TLS_VERSION_TLS_1_2;
391 
392     /* Setup this thread to listen.  */
393     status = nx_tcp_server_socket_listen(&ip_0, 12, &server_socket, 5, NX_NULL);
394     EXPECT_EQ(NX_SUCCESS, status);
395 
396     for (i = TEST_START; i < (sizeof(test_packets_size) / sizeof(UINT)); i++)
397     {
398 
399         /* Accept a client socket connection.  */
400         status = nx_tcp_server_socket_accept(&server_socket, 5 * NX_IP_PERIODIC_RATE);
401         EXPECT_EQ(NX_SUCCESS, status);
402         tx_thread_suspend(&ntest_0);
403 
404         /* Receive ClientHello. */
405         status =  nx_tcp_socket_receive(&server_socket, &receive_packet, NX_WAIT_FOREVER);
406         EXPECT_EQ(NX_SUCCESS, status);
407 
408         /* Release the ClientHello packet. */
409         nx_packet_release(receive_packet);
410 
411         tx_mutex_get(&_nx_secure_tls_protection, NX_WAIT_FOREVER);
412         server_tls_session.nx_secure_tls_protocol_version = NX_SECURE_TLS_VERSION_TLS_1_2;
413         status = _nx_secure_tls_allocate_handshake_packet(&server_tls_session, &pool_0, &send_packet, NX_WAIT_FOREVER);
414         tx_mutex_put(&_nx_secure_tls_protection);
415         EXPECT_EQ(NX_SUCCESS, status);
416 
417         memcpy(send_packet -> nx_packet_prepend_ptr, test_packets_data[i], test_packets_size[i]);
418         send_packet -> nx_packet_length = test_packets_size[i];
419         send_packet -> nx_packet_append_ptr = send_packet -> nx_packet_prepend_ptr + send_packet -> nx_packet_length;
420 
421         /* Send an invaild message. */
422         tx_mutex_get(&_nx_secure_tls_protection, NX_WAIT_FOREVER);
423         status = _nx_secure_tls_send_handshake_record(&server_tls_session, send_packet, NX_SECURE_TLS_SERVER_HELLO, NX_WAIT_FOREVER);
424         tx_mutex_put(&_nx_secure_tls_protection);
425         EXPECT_EQ(NX_SUCCESS, status);
426 
427         /* Try receiving records from the remote host. */
428         status = nx_packet_allocate(&pool_0, &receive_packet, NX_IPv4_TCP_PACKET, NX_WAIT_FOREVER);
429         EXPECT_EQ(NX_SUCCESS, status);
430         server_tls_session.nx_secure_tls_socket_type = NX_SECURE_TLS_SESSION_TYPE_SERVER;
431         status = _nx_secure_tls_session_receive_records(&server_tls_session, &receive_packet, 5 * NX_IP_PERIODIC_RATE);
432         if (i == 6)
433         {
434             EXPECT_EQ(NX_NO_PACKET, status);
435         }
436         else
437         {
438             EXPECT_EQ(NX_SECURE_TLS_ALERT_RECEIVED, status);
439         }
440 
441         status = nx_secure_tls_session_end(&server_tls_session, NX_NO_WAIT);
442         status += nx_tcp_socket_disconnect(&server_socket, NX_WAIT_FOREVER);
443         status += nx_tcp_server_socket_unaccept(&server_socket);
444         status += nx_tcp_server_socket_relisten(&ip_0, 12, &server_socket);
445         EXPECT_EQ(NX_SUCCESS, status);
446     }
447 
448     /* End the TLS session. This is required to properly shut down the TLS connection. */
449     status += nx_tcp_server_socket_unlisten(&ip_0, 12);
450     status += nx_secure_tls_session_delete(&server_tls_session);
451     status += nx_tcp_socket_delete(&server_socket);
452     EXPECT_EQ(NX_SUCCESS, status);
453 
454 }
455 
456 /* -----===== CLIENT =====----- */
457 
ntest_1_entry(ULONG thread_input)458 static void    ntest_1_entry(ULONG thread_input)
459 {
460 UINT       status, i;
461 NX_PACKET *send_packet = NX_NULL;
462 NX_SECURE_TLS_HELLO_EXTENSION         extension_data[NX_SECURE_TLS_HELLO_EXTENSIONS_MAX];
463 UINT                                  num_extensions;
464 
465     /* Create a socket.  */
466     status = nx_tcp_socket_create(&ip_1, &client_socket, "Client Socket",
467                                   NX_IP_NORMAL, NX_FRAGMENT_OKAY, NX_IP_TIME_TO_LIVE * 100, 1024*16,
468                                   NX_NULL, NX_NULL);
469     EXPECT_EQ(NX_SUCCESS, status);
470 
471     /* Create a TLS session for our socket.  */
472     status =  nx_secure_tls_session_create(&client_tls_session,
473                                            &nx_crypto_tls_ciphers,
474                                            client_crypto_metadata,
475                                            sizeof(client_crypto_metadata));
476     EXPECT_EQ(NX_SUCCESS, status);
477 
478     /* Setup our packet reassembly buffer. */
479     nx_secure_tls_session_packet_buffer_set(&client_tls_session, client_packet_buffer, sizeof(client_packet_buffer));
480 
481     /* Make sure client certificate verification is disabled. */
482     nx_secure_tls_session_client_verify_disable(&client_tls_session);
483 
484     /* Need to allocate space for the certificate coming in from the remote host. */
485     nx_secure_tls_remote_certificate_allocate(&client_tls_session, &remote_certificate, remote_cert_buffer, sizeof(remote_cert_buffer));
486     nx_secure_tls_remote_certificate_allocate(&client_tls_session, &remote_issuer, remote_issuer_buffer, sizeof(remote_issuer_buffer));
487 
488     //nx_secure_x509_certificate_initialize(&certificate, cert_der, cert_der_len, NX_NULL, 0, private_key_der, private_key_der_len, NX_SECURE_X509_KEY_TYPE_RSA_PKCS1_DER);
489     nx_secure_x509_certificate_initialize(&client_certificate, test_device_cert_der, test_device_cert_der_len, NX_NULL, 0, test_device_cert_key_der, test_device_cert_key_der_len, NX_SECURE_X509_KEY_TYPE_RSA_PKCS1_DER);
490     nx_secure_tls_local_certificate_add(&client_tls_session, &client_certificate);
491 
492     /* Add a CA Certificate to our trusted store for verifying incoming server certificates. */
493     nx_secure_x509_certificate_initialize(&trusted_certificate, ca_cert_der, ca_cert_der_len, NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
494     nx_secure_tls_trusted_certificate_add(&client_tls_session, &trusted_certificate);
495 
496     nx_secure_tls_session_client_callback_set(&client_tls_session, test_callback);
497 
498     /* Bind the socket.  */
499     status = nx_tcp_client_socket_bind(&client_socket, 12, NX_IP_PERIODIC_RATE);
500     EXPECT_EQ(NX_SUCCESS, status);
501 
502     for (i = TEST_START ; i < (sizeof(test_packets_size) / sizeof(UINT)); i++)
503     {
504 
505         status = nx_tcp_client_socket_connect(&client_socket, IP_ADDRESS(1, 2, 3, 4), 12, 5 * NX_IP_PERIODIC_RATE);
506         EXPECT_EQ(NX_SUCCESS, status);
507 
508         tx_thread_sleep(10);
509         tx_thread_resume(&ntest_0);
510         status = nx_secure_tls_session_start(&client_tls_session, &client_socket, 5 * NX_IP_PERIODIC_RATE);
511         EXPECT_EQ(test_status[i], status);
512 
513         /* Disconnect this socket.  */
514         status = nx_secure_tls_session_end(&client_tls_session, NX_NO_WAIT);
515         status += nx_tcp_socket_disconnect(&client_socket, NX_WAIT_FOREVER);
516         EXPECT_EQ(NX_SUCCESS, status);
517     }
518 
519 #ifndef NX_SECURE_TLS_DISABLE_SECURE_RENEGOTIATION
520     client_tls_session.nx_secure_tls_local_session_active = 0;
521     client_tls_session.nx_secure_tls_remote_session_active = 1;
522     client_tls_session.nx_secure_tls_session_ciphersuite = &_nx_crypto_ciphersuite_lookup_table[1];
523     status = _nx_secure_tls_process_serverhello_extensions(&client_tls_session, server_hello_test_12, 0x1d, extension_data, &num_extensions);
524     EXPECT_EQ(NX_SECURE_TLS_RENEGOTIATION_EXTENSION_ERROR, status);
525 
526     client_tls_session.nx_secure_tls_local_session_active = 1;
527     client_tls_session.nx_secure_tls_remote_session_active = 0;
528     status = _nx_secure_tls_process_serverhello_extensions(&client_tls_session, server_hello_test_12, 0x1d, extension_data, &num_extensions);
529     EXPECT_EQ(NX_SECURE_TLS_RENEGOTIATION_EXTENSION_ERROR, status);
530 
531     client_tls_session.nx_secure_tls_local_session_active = 1;
532     client_tls_session.nx_secure_tls_remote_session_active = 1;
533     client_tls_session.nx_secure_tls_secure_renegotiation = 0;
534     status = _nx_secure_tls_process_serverhello_extensions(&client_tls_session, server_hello_test_12, 0x1d, extension_data, &num_extensions);
535     EXPECT_EQ(NX_SECURE_TLS_RENEGOTIATION_EXTENSION_ERROR, status);
536 
537     client_tls_session.nx_secure_tls_local_session_active = 1;
538     client_tls_session.nx_secure_tls_remote_session_active = 1;
539     client_tls_session.nx_secure_tls_secure_renegotiation = 1;
540     status = _nx_secure_tls_process_serverhello_extensions(&client_tls_session, server_hello_test_13, 0x1d, extension_data, &num_extensions);
541     EXPECT_EQ(NX_SECURE_TLS_RENEGOTIATION_EXTENSION_ERROR, status);
542 
543     memcpy(client_tls_session.nx_secure_tls_local_verify_data, &server_hello_test_12[5], NX_SECURE_TLS_FINISHED_HASH_SIZE);
544     memcpy(client_tls_session.nx_secure_tls_remote_verify_data, &server_hello_test_12[17], NX_SECURE_TLS_FINISHED_HASH_SIZE);
545 
546     client_tls_session.nx_secure_tls_remote_verify_data[0] = 0xff;
547     status = _nx_secure_tls_process_serverhello_extensions(&client_tls_session, server_hello_test_12, 0x1d, extension_data, &num_extensions);
548     EXPECT_EQ(NX_SECURE_TLS_RENEGOTIATION_EXTENSION_ERROR, status);
549 
550     client_tls_session.nx_secure_tls_local_verify_data[0] = 0xff;
551     status = _nx_secure_tls_process_serverhello_extensions(&client_tls_session, server_hello_test_12, 0x1d, extension_data, &num_extensions);
552     EXPECT_EQ(NX_SECURE_TLS_RENEGOTIATION_EXTENSION_ERROR, status);
553 
554     status = _nx_secure_tls_process_serverhello_extensions(&client_tls_session, server_hello_test_14, 0x6, extension_data, &num_extensions);
555     EXPECT_EQ(NX_SECURE_TLS_RENEGOTIATION_EXTENSION_ERROR, status);
556 
557     status = _nx_secure_tls_process_serverhello_extensions(&client_tls_session, server_hello_test_15, 0x5, extension_data, &num_extensions);
558     EXPECT_EQ(NX_SECURE_TLS_RENEGOTIATION_EXTENSION_ERROR, status);
559 #endif
560 
561     /* Unbind the socket.  */
562     status = nx_tcp_client_socket_unbind(&client_socket);
563     EXPECT_EQ(NX_SUCCESS, status);
564 
565     /* Delete TLS session. */
566     status = nx_secure_tls_session_delete(&client_tls_session);
567     EXPECT_EQ(NX_SUCCESS, status);
568 
569     /* Delete the socket.  */
570     status = nx_tcp_socket_delete(&client_socket);
571     EXPECT_EQ(NX_SUCCESS, status);
572 
573     printf("SUCCESS!\n");
574     test_control_return(0);
575 }
576 
577 #else
578 #ifdef CTEST
579 void test_application_define(void *first_unused_memory);
test_application_define(void * first_unused_memory)580 void test_application_define(void *first_unused_memory)
581 #else
582 VOID    nx_secure_tls_serverhello_coverage_test_application_define(void *first_unused_memory)
583 #endif
584 {
585 
586     /* Print out test information banner.  */
587     printf("NetX Secure Test:   TLS ServerHello Coverage Test......................N/A\n");
588     test_control_return(3);
589 }
590 #endif
591