1 /* This is a small demo of the NetX Web HTTP Client/Server API running on a
2    high-performance NetX TCP/IP stack.  */
3 /* This demo works for IPv4 only */
4 
5 #include "tx_api.h"
6 #include "nx_api.h"
7 /* If not using FileX, define this option and define the file writing services
8    declared in filex_stub.h.
9 #define NX_WEB_HTTP_NO_FILEX
10 */
11 #ifndef NX_WEB_HTTP_NO_FILEX
12 #include "fx_api.h"
13 #else
14 #include "filex_stub.h"
15 #endif
16 
17 #ifndef NX_DISABLE_IPV4
18 
19 #include "nx_web_http_client.h"
20 #include "nx_web_http_server.h"
21 #include "nx_crypto.h"
22 #include "nx_secure_tls_api.h"
23 #include "nx_secure_x509.h"
24 
25 /* Comment out this macro to see the separated API for building
26    custom HTTP client requests. */
27 #define NX_WEB_SIMPLE_HTTPS_GET_DEMO
28 
29 
30 #define     DEMO_STACK_SIZE         4096
31 
32 /* Replace the 'ram' driver with your Ethernet driver. */
33 VOID    _nx_ram_network_driver(struct NX_IP_DRIVER_STRUCT *driver_req);
34 VOID    _fx_ram_driver(FX_MEDIA *media_ptr) ;
35 
36 /* Set up the HTTP client global variables. */
37 
38 #define         CLIENT_PACKET_SIZE  (NX_WEB_HTTP_CLIENT_MIN_PACKET_SIZE * 2)
39 
40 static TX_THREAD           client_thread;
41 static NX_PACKET_POOL      client_pool;
42 static NX_WEB_HTTP_CLIENT  my_client;
43 static NX_IP               client_ip;
44 static UINT                error_counter;
45 
46 /* Set up the HTTP server global variables */
47 
48 #define         SERVER_PACKET_SIZE  (NX_WEB_HTTP_SERVER_MIN_PACKET_SIZE * 2)
49 
50 static NX_WEB_HTTP_SERVER  my_server;
51 static NX_PACKET_POOL      server_pool;
52 static TX_THREAD           server_thread;
53 static NX_IP               server_ip;
54 static NXD_ADDRESS         server_ip_address;
55 
56 static void https_client_thread_entry(ULONG thread_input);
57 static void https_server_thread_entry(ULONG thread_input);
58 
59 
60 #ifdef NX_WEB_HTTPS_ENABLE
61 /* HTTPS/TLS setup. */
62 
63 /* Define some demo certificates. First, the server/device certificate. */
64 static unsigned char test_device_cert_der[] = {
65   0x30, 0x82, 0x03, 0xd2, 0x30, 0x82, 0x02, 0xba, 0xa0, 0x03, 0x02, 0x01,
66   0x02, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
67   0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x7a, 0x31, 0x0b, 0x30,
68   0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b,
69   0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x02, 0x43, 0x41, 0x31,
70   0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x53, 0x61,
71   0x6e, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x31, 0x16, 0x30, 0x14, 0x06,
72   0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0d, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73,
73   0x73, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x31, 0x14, 0x30, 0x12, 0x06,
74   0x03, 0x55, 0x04, 0x0b, 0x0c, 0x0b, 0x4e, 0x65, 0x74, 0x58, 0x20, 0x53,
75   0x65, 0x63, 0x75, 0x72, 0x65, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55,
76   0x04, 0x03, 0x0c, 0x13, 0x4e, 0x65, 0x74, 0x58, 0x20, 0x53, 0x65, 0x63,
77   0x75, 0x72, 0x65, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30,
78   0x1e, 0x17, 0x0d, 0x31, 0x36, 0x31, 0x31, 0x31, 0x31, 0x31, 0x39, 0x35,
79   0x31, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31, 0x31, 0x30, 0x39,
80   0x31, 0x39, 0x35, 0x31, 0x30, 0x30, 0x5a, 0x30, 0x62, 0x31, 0x0b, 0x30,
81   0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b,
82   0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x02, 0x43, 0x41, 0x31,
83   0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0d, 0x45, 0x78,
84   0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x31,
85   0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x0b, 0x4e, 0x65,
86   0x74, 0x58, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x31, 0x18, 0x30,
87   0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, 0x77, 0x77, 0x77, 0x2e,
88   0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30,
89   0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
90   0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,
91   0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xae, 0x03, 0x2c, 0xec,
92   0xa2, 0x79, 0xd1, 0x15, 0x20, 0x88, 0x4d, 0xcd, 0xa2, 0x1b, 0x05, 0xe3,
93   0xbd, 0x55, 0xad, 0xc6, 0x1f, 0x64, 0xe8, 0xb5, 0xc5, 0x0d, 0x67, 0xfc,
94   0x7e, 0xda, 0xfb, 0x70, 0xf6, 0xc9, 0x47, 0x87, 0x3a, 0xaa, 0x88, 0x00,
95   0xf1, 0xa7, 0xf7, 0xe1, 0xf5, 0x2c, 0x54, 0x0e, 0x33, 0xda, 0xbe, 0x9c,
96   0x66, 0x30, 0xd9, 0x40, 0xeb, 0x1d, 0xce, 0xe1, 0x55, 0x15, 0x2b, 0x11,
97   0x47, 0x6c, 0x7e, 0x88, 0xc6, 0x24, 0xcf, 0x87, 0x1b, 0xb5, 0x1f, 0x47,
98   0xb9, 0xef, 0xad, 0x29, 0xd3, 0x2e, 0x43, 0xee, 0x39, 0xdd, 0x09, 0x54,
99   0xba, 0xfc, 0xed, 0xbc, 0x2e, 0x0e, 0x53, 0x15, 0x37, 0xcb, 0xc5, 0xf5,
100   0xee, 0x70, 0x2a, 0xe8, 0x01, 0x6d, 0xb1, 0x39, 0x94, 0x5a, 0xc2, 0x8a,
101   0x00, 0x04, 0xa9, 0xff, 0xea, 0x56, 0xf7, 0xd7, 0xa8, 0x1b, 0xa4, 0x26,
102   0xcd, 0x28, 0xaf, 0xfa, 0x52, 0x85, 0x1c, 0x26, 0x3e, 0x5e, 0x01, 0xf7,
103   0xe1, 0x66, 0xff, 0xac, 0xad, 0x9c, 0x98, 0x2f, 0xe0, 0x7e, 0x9f, 0xf1,
104   0x33, 0x31, 0xc3, 0x7f, 0xe6, 0x58, 0x5d, 0xd8, 0x5f, 0x7d, 0x2b, 0x5a,
105   0x55, 0xcf, 0xb1, 0x91, 0x53, 0x41, 0x04, 0xac, 0x86, 0x5e, 0x01, 0x35,
106   0x2b, 0x74, 0x8d, 0x46, 0x4d, 0x48, 0xc0, 0x5f, 0x83, 0x67, 0xb5, 0x6d,
107   0x52, 0x3f, 0x3e, 0xe6, 0xec, 0xf8, 0x2e, 0x10, 0x28, 0xdb, 0x69, 0xa6,
108   0x9d, 0x4b, 0xde, 0x19, 0x2e, 0xd2, 0x5f, 0xc8, 0xa9, 0x3b, 0x52, 0xe9,
109   0xb2, 0xcd, 0x6e, 0x19, 0x22, 0xf9, 0x99, 0xa6, 0xcc, 0xf5, 0xd3, 0xec,
110   0xff, 0x0c, 0x77, 0x6f, 0x25, 0x92, 0x07, 0x4c, 0x64, 0x7d, 0x34, 0x49,
111   0x6f, 0xff, 0x0a, 0xa8, 0x15, 0x64, 0x72, 0x2d, 0x4f, 0x42, 0x05, 0xe8,
112   0x2b, 0x01, 0xf1, 0xe3, 0x65, 0x94, 0x23, 0xd9, 0xdf, 0x5e, 0x3b, 0xb5,
113   0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x7b, 0x30, 0x79, 0x30, 0x09, 0x06,
114   0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x2c, 0x06, 0x09,
115   0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x1f, 0x16,
116   0x1d, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x53, 0x4c, 0x20, 0x47, 0x65, 0x6e,
117   0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,
118   0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,
119   0x0e, 0x04, 0x16, 0x04, 0x14, 0x8d, 0xb0, 0xee, 0x8f, 0x6b, 0x43, 0x52,
120   0x29, 0xf4, 0x25, 0xff, 0x3c, 0xda, 0x5f, 0xb3, 0xce, 0x9b, 0x7b, 0x75,
121   0xe1, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16,
122   0x80, 0x14, 0x1b, 0x8d, 0x06, 0xd9, 0x6b, 0xad, 0xee, 0x82, 0x24, 0x26,
123   0x55, 0x9a, 0x1b, 0x03, 0x44, 0x92, 0x0a, 0x06, 0x92, 0x48, 0x30, 0x0d,
124   0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
125   0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x75, 0x83, 0x89, 0xab, 0x84, 0x52,
126   0x5f, 0xa4, 0x9e, 0x98, 0xca, 0xa3, 0xf9, 0xab, 0xd4, 0x04, 0x32, 0xa4,
127   0x8c, 0x96, 0x90, 0x39, 0x88, 0x92, 0xc3, 0xcd, 0x51, 0xc3, 0x01, 0x35,
128   0x03, 0x78, 0xfa, 0x0d, 0x1e, 0x7b, 0x79, 0xe9, 0x7d, 0xd8, 0x68, 0x7a,
129   0x65, 0xc6, 0x00, 0x7c, 0xa1, 0x7a, 0x52, 0xc9, 0xa3, 0xf4, 0x0b, 0xbd,
130   0x76, 0x24, 0xdf, 0xde, 0x22, 0x2d, 0x95, 0xc5, 0xb6, 0x54, 0xb1, 0xac,
131   0xb6, 0x9a, 0xe4, 0x68, 0x0f, 0x97, 0x4a, 0x44, 0xa2, 0x87, 0x01, 0x82,
132   0xd4, 0x25, 0xbd, 0x01, 0xbc, 0x35, 0x8a, 0x6d, 0xb7, 0x7c, 0x48, 0xaa,
133   0x92, 0xd7, 0x57, 0x76, 0x6a, 0xb0, 0xc9, 0x46, 0xa6, 0xbe, 0xbf, 0x0f,
134   0xf0, 0xea, 0x62, 0x57, 0x71, 0x42, 0xf6, 0x67, 0xa7, 0xa1, 0x50, 0x87,
135   0x14, 0x8e, 0x32, 0xd0, 0x5e, 0xc9, 0x7b, 0x79, 0x7e, 0xfa, 0x17, 0xc7,
136   0xad, 0xbd, 0xc3, 0x98, 0x79, 0x45, 0xfb, 0x7f, 0xf7, 0xe6, 0x9f, 0x77,
137   0xb3, 0x44, 0xc3, 0xaf, 0x6b, 0x61, 0x6a, 0x04, 0x68, 0x24, 0x2d, 0x31,
138   0xf1, 0x28, 0x2c, 0xf4, 0xf0, 0x07, 0xfe, 0xfd, 0x66, 0x98, 0x77, 0x37,
139   0x7b, 0x80, 0x1f, 0xb2, 0x49, 0xe4, 0xa6, 0x24, 0x72, 0x42, 0xf4, 0xca,
140   0x91, 0x80, 0xa1, 0xb2, 0x0a, 0xc9, 0xc0, 0x93, 0xa7, 0x22, 0x0b, 0x13,
141   0x8a, 0xb2, 0x75, 0x4b, 0x66, 0xf9, 0x87, 0x3a, 0x51, 0x97, 0xc7, 0x1e,
142   0x2b, 0x61, 0x81, 0x5c, 0xf0, 0xf8, 0x4c, 0xdb, 0x36, 0xc7, 0xba, 0x49,
143   0xd9, 0x04, 0x6a, 0x95, 0xb0, 0x7f, 0xfc, 0xce, 0xca, 0x23, 0xad, 0xf9,
144   0xaf, 0x8a, 0x72, 0x8e, 0xab, 0xb8, 0x8b, 0x7e, 0xf7, 0x39, 0xa6, 0x22,
145   0x56, 0x03, 0x72, 0x06, 0xc3, 0x57, 0x1f, 0x32, 0xaa, 0xb5, 0xa6, 0x00,
146   0x67, 0x88, 0x4b, 0x40, 0xe9, 0x5e, 0x4a, 0x6f, 0x76, 0xe8
147 };
148 static unsigned int test_device_cert_der_len = 982;
149 
150 /* Server private RSA key. */
151 static unsigned char test_device_cert_key_der[] = {
152   0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
153   0xae, 0x03, 0x2c, 0xec, 0xa2, 0x79, 0xd1, 0x15, 0x20, 0x88, 0x4d, 0xcd,
154   0xa2, 0x1b, 0x05, 0xe3, 0xbd, 0x55, 0xad, 0xc6, 0x1f, 0x64, 0xe8, 0xb5,
155   0xc5, 0x0d, 0x67, 0xfc, 0x7e, 0xda, 0xfb, 0x70, 0xf6, 0xc9, 0x47, 0x87,
156   0x3a, 0xaa, 0x88, 0x00, 0xf1, 0xa7, 0xf7, 0xe1, 0xf5, 0x2c, 0x54, 0x0e,
157   0x33, 0xda, 0xbe, 0x9c, 0x66, 0x30, 0xd9, 0x40, 0xeb, 0x1d, 0xce, 0xe1,
158   0x55, 0x15, 0x2b, 0x11, 0x47, 0x6c, 0x7e, 0x88, 0xc6, 0x24, 0xcf, 0x87,
159   0x1b, 0xb5, 0x1f, 0x47, 0xb9, 0xef, 0xad, 0x29, 0xd3, 0x2e, 0x43, 0xee,
160   0x39, 0xdd, 0x09, 0x54, 0xba, 0xfc, 0xed, 0xbc, 0x2e, 0x0e, 0x53, 0x15,
161   0x37, 0xcb, 0xc5, 0xf5, 0xee, 0x70, 0x2a, 0xe8, 0x01, 0x6d, 0xb1, 0x39,
162   0x94, 0x5a, 0xc2, 0x8a, 0x00, 0x04, 0xa9, 0xff, 0xea, 0x56, 0xf7, 0xd7,
163   0xa8, 0x1b, 0xa4, 0x26, 0xcd, 0x28, 0xaf, 0xfa, 0x52, 0x85, 0x1c, 0x26,
164   0x3e, 0x5e, 0x01, 0xf7, 0xe1, 0x66, 0xff, 0xac, 0xad, 0x9c, 0x98, 0x2f,
165   0xe0, 0x7e, 0x9f, 0xf1, 0x33, 0x31, 0xc3, 0x7f, 0xe6, 0x58, 0x5d, 0xd8,
166   0x5f, 0x7d, 0x2b, 0x5a, 0x55, 0xcf, 0xb1, 0x91, 0x53, 0x41, 0x04, 0xac,
167   0x86, 0x5e, 0x01, 0x35, 0x2b, 0x74, 0x8d, 0x46, 0x4d, 0x48, 0xc0, 0x5f,
168   0x83, 0x67, 0xb5, 0x6d, 0x52, 0x3f, 0x3e, 0xe6, 0xec, 0xf8, 0x2e, 0x10,
169   0x28, 0xdb, 0x69, 0xa6, 0x9d, 0x4b, 0xde, 0x19, 0x2e, 0xd2, 0x5f, 0xc8,
170   0xa9, 0x3b, 0x52, 0xe9, 0xb2, 0xcd, 0x6e, 0x19, 0x22, 0xf9, 0x99, 0xa6,
171   0xcc, 0xf5, 0xd3, 0xec, 0xff, 0x0c, 0x77, 0x6f, 0x25, 0x92, 0x07, 0x4c,
172   0x64, 0x7d, 0x34, 0x49, 0x6f, 0xff, 0x0a, 0xa8, 0x15, 0x64, 0x72, 0x2d,
173   0x4f, 0x42, 0x05, 0xe8, 0x2b, 0x01, 0xf1, 0xe3, 0x65, 0x94, 0x23, 0xd9,
174   0xdf, 0x5e, 0x3b, 0xb5, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
175   0x01, 0x00, 0xa5, 0x22, 0x2c, 0x52, 0xd0, 0x09, 0x4c, 0x4a, 0x81, 0x59,
176   0xf8, 0x83, 0xa9, 0x4f, 0x7d, 0xb2, 0x56, 0xad, 0xe5, 0x3f, 0xfb, 0xf0,
177   0xf6, 0x09, 0xf1, 0x5b, 0x3c, 0x90, 0x58, 0x0e, 0x15, 0xc9, 0x68, 0xd9,
178   0x30, 0x40, 0xfb, 0x82, 0x73, 0x98, 0x79, 0xbb, 0xcd, 0xb8, 0x27, 0xc3,
179   0x8e, 0x6c, 0xff, 0xf6, 0x99, 0x26, 0xb0, 0xaf, 0xb0, 0xac, 0x33, 0xb3,
180   0x50, 0xed, 0x73, 0xa1, 0xa8, 0x02, 0x38, 0xc6, 0x93, 0xf9, 0xd6, 0x17,
181   0x7e, 0xbd, 0x97, 0xa4, 0xb5, 0x6f, 0x8a, 0xdb, 0x11, 0x78, 0x7c, 0x89,
182   0x0e, 0x3c, 0x17, 0xbb, 0x54, 0x2c, 0x8d, 0x5a, 0x93, 0x7d, 0x1e, 0x33,
183   0xc7, 0xd2, 0x7d, 0xe5, 0xaa, 0x12, 0x2d, 0xd9, 0x52, 0x4e, 0x63, 0x74,
184   0xa6, 0x57, 0x9f, 0x1a, 0xd6, 0x3c, 0xc1, 0xb1, 0xab, 0x66, 0x4a, 0x0b,
185   0x88, 0x1d, 0xa6, 0xd1, 0xbc, 0x60, 0x7a, 0x17, 0x1f, 0x8f, 0x9b, 0x35,
186   0x57, 0xf8, 0xd0, 0x1c, 0xd3, 0xa6, 0x56, 0xc8, 0x03, 0x9c, 0x08, 0x3b,
187   0x1b, 0x5b, 0xc2, 0x03, 0x3b, 0x3a, 0xa4, 0xe8, 0xed, 0x75, 0x66, 0xb0,
188   0x85, 0x56, 0x40, 0xfe, 0xae, 0x97, 0x7e, 0xc0, 0x79, 0x49, 0x13, 0x8b,
189   0x01, 0x0c, 0xae, 0x4c, 0x3d, 0x54, 0x47, 0xc5, 0x51, 0x40, 0x3d, 0xcc,
190   0x4d, 0x17, 0xb3, 0x4e, 0x1d, 0x85, 0x1c, 0x41, 0x07, 0x03, 0x5e, 0xf9,
191   0xfa, 0x17, 0x81, 0x24, 0x34, 0xaa, 0xbf, 0x67, 0x73, 0xb6, 0x9c, 0x67,
192   0x36, 0xd9, 0xee, 0xf7, 0x86, 0x4c, 0x4d, 0x79, 0xca, 0xd7, 0xfd, 0x72,
193   0xf9, 0xb3, 0x73, 0xc3, 0x57, 0xe5, 0x39, 0x72, 0x93, 0x56, 0xc2, 0xec,
194   0xf8, 0x25, 0xe4, 0x8f, 0xba, 0xd0, 0x6f, 0x23, 0x8c, 0x39, 0x9e, 0x05,
195   0x1a, 0x4e, 0xdc, 0x5e, 0xcd, 0x17, 0x59, 0x94, 0x37, 0x22, 0xb7, 0x39,
196   0x50, 0x65, 0xdc, 0x91, 0x3c, 0xe1, 0x02, 0x81, 0x81, 0x00, 0xe4, 0xc6,
197   0x42, 0xe5, 0xea, 0xe5, 0x32, 0xf3, 0x51, 0x36, 0x7b, 0x8c, 0x5b, 0x72,
198   0x24, 0x1a, 0x4a, 0x44, 0x4f, 0x64, 0xe5, 0xa7, 0x74, 0xd9, 0xb2, 0x29,
199   0x8a, 0x08, 0xcf, 0x9b, 0xd2, 0x9d, 0xc4, 0x20, 0x4c, 0xd3, 0x60, 0x4d,
200   0xf7, 0xb7, 0xac, 0x92, 0x6b, 0x2b, 0x95, 0x73, 0x6e, 0x57, 0x00, 0x20,
201   0x9d, 0xb2, 0xf6, 0xbd, 0x0b, 0xbb, 0xaa, 0x7e, 0x7e, 0x3e, 0x53, 0xfb,
202   0x79, 0x7e, 0x45, 0xd5, 0x2e, 0xab, 0x5e, 0xff, 0x5c, 0x0a, 0x45, 0x2d,
203   0x27, 0x19, 0xb0, 0x59, 0x0a, 0x39, 0x89, 0xf6, 0xae, 0xc6, 0xe2, 0xd1,
204   0x07, 0x58, 0xbe, 0x95, 0x27, 0xaf, 0xf7, 0xa6, 0x2f, 0xaa, 0x37, 0x25,
205   0x7c, 0x7b, 0xd3, 0xda, 0x13, 0x76, 0x0a, 0xb6, 0x6c, 0x99, 0x53, 0x5d,
206   0xa5, 0x75, 0xfa, 0x10, 0x9b, 0x7f, 0xfe, 0xd7, 0xb4, 0x18, 0x95, 0xa8,
207   0x65, 0x85, 0x07, 0xc5, 0xc4, 0xad, 0x02, 0x81, 0x81, 0x00, 0xc2, 0xb8,
208   0x8e, 0xed, 0x9d, 0x4a, 0x1f, 0x9c, 0xda, 0x73, 0xf0, 0x2c, 0x35, 0x91,
209   0xe4, 0x40, 0x78, 0xe1, 0x12, 0xf3, 0x08, 0xef, 0xdf, 0x97, 0xa0, 0xb0,
210   0xdd, 0xea, 0xc2, 0xb9, 0x5b, 0xf8, 0xa1, 0xac, 0x32, 0xfd, 0xb8, 0xe9,
211   0x0f, 0xed, 0xfd, 0xe0, 0xdc, 0x38, 0x90, 0x5e, 0xf5, 0x4c, 0x02, 0xc3,
212   0x1a, 0x72, 0x18, 0xf7, 0xfe, 0xb7, 0xb8, 0x2a, 0xf8, 0x72, 0xbb, 0x99,
213   0x56, 0xec, 0x85, 0x58, 0x31, 0x7e, 0x64, 0xdf, 0x02, 0x05, 0xe3, 0xb2,
214   0xbb, 0xe2, 0x1b, 0xd6, 0x43, 0x73, 0xf8, 0x0f, 0xaf, 0x89, 0x57, 0x44,
215   0x5f, 0x30, 0x1c, 0xe5, 0x78, 0xbf, 0x0b, 0xe7, 0x4b, 0xbe, 0x80, 0x2f,
216   0x3d, 0x35, 0x44, 0xfc, 0x9e, 0x0d, 0x85, 0x5d, 0x94, 0x6e, 0xe9, 0x6a,
217   0x72, 0xa7, 0x46, 0xd8, 0x64, 0x6c, 0xe9, 0x61, 0x92, 0xa0, 0xb6, 0xd1,
218   0xee, 0xa6, 0xa6, 0xf4, 0x2c, 0x29, 0x02, 0x81, 0x81, 0x00, 0xb4, 0xa7,
219   0x7b, 0x1c, 0x64, 0x29, 0x29, 0xda, 0xca, 0x3e, 0xe3, 0xc1, 0x2a, 0x55,
220   0x2f, 0xfd, 0x32, 0xb8, 0x4e, 0x99, 0xb6, 0x60, 0x4d, 0xfd, 0xba, 0x9a,
221   0xe2, 0xcd, 0xa2, 0x63, 0xc2, 0x25, 0xa3, 0x42, 0x7e, 0x68, 0x4c, 0x9c,
222   0x45, 0x09, 0x5d, 0xd5, 0x21, 0x9c, 0x01, 0x20, 0x6d, 0xf9, 0x75, 0xb8,
223   0x4b, 0xcf, 0x8e, 0xd8, 0x29, 0xf3, 0xbf, 0xe6, 0xb3, 0x7a, 0x34, 0x87,
224   0x58, 0xa1, 0x46, 0x33, 0xd9, 0xee, 0xa9, 0xcd, 0xac, 0xb8, 0xcf, 0x77,
225   0xa0, 0x70, 0xc0, 0xb9, 0x0f, 0x41, 0xf0, 0x98, 0x43, 0xdb, 0xfa, 0x30,
226   0x66, 0x44, 0xc5, 0xfa, 0xb2, 0xa4, 0x5a, 0x43, 0x79, 0x50, 0x48, 0xcb,
227   0xe9, 0x49, 0x3f, 0x39, 0xee, 0x34, 0x40, 0xb1, 0x5d, 0x80, 0x96, 0x3c,
228   0x54, 0xf4, 0x9c, 0xcb, 0x90, 0x7f, 0xba, 0x96, 0x4b, 0x39, 0x3e, 0xb5,
229   0x03, 0xb5, 0xd1, 0x35, 0x72, 0xe1, 0x02, 0x81, 0x80, 0x60, 0x14, 0xd5,
230   0x61, 0xe6, 0x24, 0xf7, 0x28, 0x5c, 0x9a, 0xac, 0xbe, 0x03, 0xc8, 0xf3,
231   0x49, 0xe4, 0xdb, 0x9a, 0x90, 0x15, 0xae, 0xd7, 0x33, 0x68, 0x75, 0x1d,
232   0x6b, 0x83, 0x9e, 0x17, 0x05, 0xbe, 0x30, 0xcc, 0x10, 0x6a, 0x37, 0x86,
233   0x46, 0xb6, 0xe9, 0x47, 0x81, 0x19, 0xab, 0xe1, 0x7a, 0x1a, 0x3a, 0xcf,
234   0x47, 0xd1, 0x8e, 0x3d, 0x3f, 0xc6, 0x3e, 0x5d, 0xcd, 0xaf, 0x47, 0xe0,
235   0x9e, 0x60, 0xc5, 0xbd, 0xd6, 0x52, 0x4b, 0xc0, 0x21, 0xcb, 0xd3, 0x1b,
236   0xe6, 0x5c, 0x3a, 0x03, 0x9a, 0xab, 0xa2, 0x81, 0xc9, 0x51, 0x28, 0x49,
237   0x97, 0xe2, 0x0a, 0x50, 0xe4, 0x64, 0x29, 0x43, 0x34, 0xc2, 0xe7, 0x8c,
238   0x5a, 0x46, 0xaa, 0x28, 0x0b, 0x1f, 0xed, 0xa7, 0x1a, 0x7b, 0x4e, 0xad,
239   0x38, 0x61, 0x3a, 0xd1, 0x82, 0xf4, 0x3d, 0xd3, 0x2e, 0x3e, 0x47, 0xa4,
240   0x6c, 0xd3, 0x20, 0xd4, 0xd1, 0x02, 0x81, 0x80, 0x68, 0x1a, 0x8d, 0x3c,
241   0x18, 0x3f, 0x42, 0x5e, 0x38, 0x6d, 0x0a, 0x1e, 0x52, 0xd5, 0x8f, 0xd6,
242   0x32, 0xff, 0x7c, 0x1c, 0xf3, 0x20, 0x8b, 0x92, 0xa5, 0x44, 0xff, 0x08,
243   0x21, 0xa1, 0xce, 0x68, 0x8b, 0x03, 0xe0, 0x90, 0xeb, 0x01, 0x4e, 0x85,
244   0xf9, 0xc5, 0xb7, 0x86, 0xee, 0xd0, 0x59, 0x10, 0x73, 0x98, 0x2a, 0xcb,
245   0xf6, 0xfe, 0x0d, 0xba, 0x07, 0x91, 0x18, 0xf6, 0xbc, 0x93, 0x8a, 0x91,
246   0xdd, 0x80, 0x16, 0x37, 0xdf, 0x75, 0x46, 0x87, 0x68, 0xee, 0xf4, 0x76,
247   0x0c, 0xc5, 0x87, 0x38, 0xf5, 0xb6, 0xda, 0x8a, 0xee, 0x62, 0xc8, 0xc0,
248   0xa2, 0x8d, 0xbf, 0xd5, 0xf8, 0xba, 0xb5, 0x74, 0xf0, 0x07, 0xa6, 0x1c,
249   0xcf, 0x76, 0x61, 0xbe, 0xa4, 0x88, 0x4a, 0x95, 0xb0, 0xa3, 0x70, 0x73,
250   0xa1, 0x6f, 0x73, 0xf0, 0xe8, 0x38, 0x8d, 0xe8, 0xd0, 0x7e, 0x2c, 0x0c,
251   0xdc, 0x21, 0xfa, 0xc1
252 };
253 
254 static unsigned int test_device_cert_key_der_len = 1192;
255 
256 /* Trusted CA certificate for Client. */
257 static unsigned char test_ca_cert_der[] = {
258   0x30, 0x82, 0x03, 0xc7, 0x30, 0x82, 0x02, 0xaf, 0xa0, 0x03, 0x02, 0x01,
259   0x02, 0x02, 0x09, 0x00, 0xa1, 0x79, 0xb0, 0x6a, 0x32, 0xbc, 0x48, 0x67,
260   0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
261   0x0b, 0x05, 0x00, 0x30, 0x7a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
262   0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,
263   0x55, 0x04, 0x08, 0x0c, 0x02, 0x43, 0x41, 0x31, 0x12, 0x30, 0x10, 0x06,
264   0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x53, 0x61, 0x6e, 0x20, 0x44, 0x69,
265   0x65, 0x67, 0x6f, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a,
266   0x0c, 0x0d, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x4c, 0x6f,
267   0x67, 0x69, 0x63, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b,
268   0x0c, 0x0b, 0x4e, 0x65, 0x74, 0x58, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72,
269   0x65, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13,
270   0x4e, 0x65, 0x74, 0x58, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20,
271   0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31,
272   0x36, 0x31, 0x31, 0x31, 0x31, 0x31, 0x39, 0x35, 0x30, 0x30, 0x38, 0x5a,
273   0x17, 0x0d, 0x32, 0x36, 0x31, 0x31, 0x30, 0x39, 0x31, 0x39, 0x35, 0x30,
274   0x30, 0x38, 0x5a, 0x30, 0x7a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
275   0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,
276   0x55, 0x04, 0x08, 0x0c, 0x02, 0x43, 0x41, 0x31, 0x12, 0x30, 0x10, 0x06,
277   0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x53, 0x61, 0x6e, 0x20, 0x44, 0x69,
278   0x65, 0x67, 0x6f, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a,
279   0x0c, 0x0d, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x4c, 0x6f,
280   0x67, 0x69, 0x63, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b,
281   0x0c, 0x0b, 0x4e, 0x65, 0x74, 0x58, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72,
282   0x65, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13,
283   0x4e, 0x65, 0x74, 0x58, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20,
284   0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30,
285   0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
286   0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02,
287   0x82, 0x01, 0x01, 0x00, 0xd1, 0xdc, 0x3c, 0xe1, 0x1c, 0x7a, 0x3d, 0xb7,
288   0x76, 0xcf, 0xab, 0xd7, 0x3c, 0x38, 0xb0, 0x81, 0xb6, 0x37, 0x52, 0xa3,
289   0x3d, 0x6f, 0xcd, 0x89, 0xa6, 0xa2, 0xf3, 0xa8, 0xb0, 0x8d, 0xee, 0x0b,
290   0x36, 0x94, 0x83, 0x0e, 0x7f, 0x39, 0x87, 0x6e, 0xee, 0x19, 0xe2, 0x1f,
291   0x92, 0x3d, 0x01, 0x05, 0x4f, 0x11, 0xcd, 0xcb, 0xa0, 0x79, 0xfc, 0x9d,
292   0x6e, 0x93, 0xb1, 0xb7, 0x03, 0xf3, 0xfe, 0xeb, 0x30, 0x67, 0x38, 0x85,
293   0x28, 0xdf, 0x93, 0xdb, 0xcb, 0xcb, 0xb1, 0xbe, 0xd3, 0xe1, 0xc2, 0x7d,
294   0x8d, 0xbb, 0x70, 0x76, 0x99, 0x08, 0x7c, 0x3f, 0x21, 0x2f, 0x37, 0x97,
295   0xf7, 0xe8, 0x6e, 0x8c, 0x7e, 0xbc, 0x30, 0x5f, 0xbf, 0x32, 0x51, 0x1d,
296   0x66, 0x76, 0xad, 0x39, 0xfc, 0x94, 0xd4, 0x65, 0xf6, 0xd2, 0x0b, 0x37,
297   0xd3, 0x4a, 0xe6, 0xe1, 0xdf, 0x4a, 0x8f, 0x3b, 0x33, 0x16, 0xbe, 0xf7,
298   0xd9, 0xbd, 0x73, 0x64, 0xdf, 0x34, 0xa3, 0x55, 0xe7, 0xac, 0xab, 0xa7,
299   0xae, 0xc2, 0x20, 0x46, 0xc2, 0xd1, 0xe3, 0x25, 0x3a, 0x47, 0x68, 0x92,
300   0xac, 0xd6, 0x12, 0xa4, 0x0a, 0xce, 0xdc, 0xe2, 0x24, 0x12, 0xee, 0xe1,
301   0xb2, 0xcd, 0x09, 0xa8, 0xef, 0x36, 0xea, 0x76, 0xf9, 0xb6, 0x63, 0xaa,
302   0xac, 0xdd, 0x46, 0x06, 0x6e, 0xd9, 0x1e, 0x08, 0xac, 0x57, 0x12, 0x6c,
303   0x21, 0xef, 0x8e, 0xae, 0xf0, 0x27, 0xf1, 0x5c, 0x79, 0xb4, 0xb6, 0x26,
304   0x92, 0x11, 0xda, 0xca, 0x80, 0x5e, 0x92, 0x4c, 0xb5, 0xd8, 0xb5, 0x84,
305   0x95, 0xe3, 0xef, 0xbc, 0x7e, 0x7d, 0x68, 0x74, 0x4c, 0x34, 0x1a, 0x50,
306   0x6d, 0x2d, 0x5f, 0x1b, 0x0e, 0xbe, 0xf5, 0xb4, 0xf1, 0x32, 0x16, 0x44,
307   0x24, 0x7a, 0x0e, 0x4b, 0xcd, 0xfa, 0xa5, 0x03, 0x95, 0x2e, 0x44, 0x65,
308   0xa8, 0x74, 0xea, 0x17, 0xdd, 0x99, 0xbd, 0xcb, 0x02, 0x03, 0x01, 0x00,
309   0x01, 0xa3, 0x50, 0x30, 0x4e, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,
310   0x04, 0x16, 0x04, 0x14, 0x1b, 0x8d, 0x06, 0xd9, 0x6b, 0xad, 0xee, 0x82,
311   0x24, 0x26, 0x55, 0x9a, 0x1b, 0x03, 0x44, 0x92, 0x0a, 0x06, 0x92, 0x48,
312   0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80,
313   0x14, 0x1b, 0x8d, 0x06, 0xd9, 0x6b, 0xad, 0xee, 0x82, 0x24, 0x26, 0x55,
314   0x9a, 0x1b, 0x03, 0x44, 0x92, 0x0a, 0x06, 0x92, 0x48, 0x30, 0x0c, 0x06,
315   0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
316   0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,
317   0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x70, 0xc7, 0x6a, 0x75, 0x27,
318   0x14, 0xa0, 0x1c, 0xe0, 0xe0, 0x84, 0x7c, 0x6c, 0x16, 0xa9, 0x0d, 0x4d,
319   0xb1, 0xc3, 0x87, 0x37, 0xf6, 0x86, 0x89, 0x6f, 0x73, 0xf0, 0x59, 0x9b,
320   0x8c, 0xa4, 0x83, 0x10, 0x2d, 0xb7, 0x8b, 0xd0, 0x9a, 0x81, 0xe0, 0x5c,
321   0xd7, 0x20, 0x6f, 0xdc, 0xfc, 0xc8, 0xa0, 0xc2, 0x8e, 0x54, 0xe6, 0xfb,
322   0x61, 0x85, 0x37, 0x4b, 0x22, 0x47, 0x09, 0x95, 0x44, 0x12, 0x75, 0xf0,
323   0xcf, 0x0b, 0x90, 0x48, 0xb0, 0x02, 0x4c, 0xef, 0x3f, 0xde, 0x6a, 0xfd,
324   0xb1, 0x8b, 0x88, 0xd7, 0x84, 0xe5, 0x34, 0x02, 0x96, 0x0a, 0x3f, 0xa8,
325   0x8c, 0xbd, 0x1a, 0xd8, 0xf7, 0xf9, 0xe5, 0x49, 0x87, 0xd0, 0x20, 0x4f,
326   0xd8, 0xcd, 0xc0, 0xb9, 0x11, 0x2a, 0xd9, 0x0f, 0x75, 0xa6, 0xee, 0x76,
327   0x15, 0x9f, 0x12, 0x50, 0x68, 0x4c, 0xc0, 0x05, 0x46, 0x8d, 0xdd, 0x93,
328   0x74, 0x31, 0x82, 0x20, 0x37, 0x24, 0x58, 0xb2, 0x88, 0x9b, 0x21, 0xc1,
329   0x48, 0xc4, 0x8d, 0x68, 0x3b, 0x91, 0x2c, 0x34, 0xcb, 0x94, 0xd0, 0xbc,
330   0xe3, 0x05, 0x24, 0x05, 0xcc, 0xea, 0x05, 0xb1, 0x52, 0x74, 0x4a, 0x23,
331   0x65, 0xc4, 0x40, 0x04, 0x86, 0xb1, 0x80, 0x61, 0x97, 0xdc, 0x94, 0x16,
332   0x4e, 0x63, 0x31, 0x72, 0x4e, 0x45, 0xe8, 0x3e, 0x3b, 0xb6, 0x99, 0xae,
333   0xd8, 0x91, 0x25, 0x3d, 0x62, 0x92, 0x6d, 0x72, 0x01, 0x2c, 0xca, 0x67,
334   0x0a, 0xec, 0x00, 0xeb, 0x10, 0xff, 0x6d, 0xac, 0x89, 0x19, 0x2c, 0xb7,
335   0xb3, 0xa5, 0xf7, 0xa1, 0x4a, 0xc3, 0xc1, 0xdd, 0xaf, 0xb5, 0x1a, 0x16,
336   0x44, 0xdc, 0xa8, 0xb5, 0xca, 0xd0, 0x30, 0xaa, 0x7e, 0x73, 0xd5, 0x2e,
337   0x65, 0xd6, 0xf9, 0xbf, 0x5f, 0xda, 0x6f, 0x13, 0xe9, 0xd7, 0x12, 0x6c,
338   0x3a, 0x6c, 0x50, 0x26, 0x78, 0x6e, 0xc6, 0xeb, 0x75, 0xe1, 0x3c
339 };
340 static unsigned int test_ca_cert_der_len = 971;
341 
342 #define ca_cert_der test_ca_cert_der
343 #define ca_cert_der_len test_ca_cert_der_len
344 
345 /* TLS buffers and certificate containers. */
346 static CHAR crypto_metadata_server[20000 * NX_WEB_HTTP_SERVER_SESSION_MAX];
347 static CHAR crypto_metadata_client[20000 * NX_WEB_HTTP_SERVER_SESSION_MAX];
348 static UCHAR tls_packet_buffer[40000];
349 static NX_SECURE_X509_CERT certificate;
350 static NX_SECURE_X509_CERT trusted_certificate;
351 static NX_SECURE_X509_CERT remote_certificate, remote_issuer;
352 static UCHAR remote_cert_buffer[2000];
353 static UCHAR remote_issuer_buffer[2000];
354 
355 /* For TLS Web servers, define NX_SECURE_ENABLE_AEAD_CIPHER in NetX Crypto to allow web browsers to connect using AES_128_GCM cipher suites. */
356 extern const NX_SECURE_TLS_CRYPTO nx_crypto_tls_ciphers;
357 
358 #endif /*NX_WEB_HTTPS_ENABLE */
359 
360 /* Define the RAM disk memory for FileX demo.  */
361 static UCHAR media_memory[4096];
362 static CHAR ram_disk_memory[4096];
363 static FX_MEDIA ram_disk;
364 
365 /* HTTP server stack area. */
366 static UCHAR server_stack[16000];
367 
368 /* Local IP address. */
369 #define HTTP_SERVER_ADDRESS  IP_ADDRESS(192, 168, 1, 150)
370 #define HTTP_CLIENT_ADDRESS  IP_ADDRESS(192, 168, 1, 157)
371 
372 
main()373 int main()
374 {
375 
376     /* Enter the ThreadX kernel.  */
377     tx_kernel_enter();
378 }
379 
380 
381 /* Define what the initial system looks like.  */
tx_application_define(void * first_unused_memory)382 void    tx_application_define(void *first_unused_memory)
383 {CHAR    *pointer;
384 UINT    status;
385 
386 
387     error_counter = 0;
388 
389     /* Setup the working pointer.  */
390     pointer =  (CHAR *) first_unused_memory;
391 
392     /* Create a helper thread for the server. */
393     tx_thread_create(&server_thread, "HTTP Server thread", https_server_thread_entry, 0,
394                      pointer, DEMO_STACK_SIZE,
395                      4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
396 
397     pointer =  pointer + DEMO_STACK_SIZE;
398 
399     /* Initialize the NetX system.  */
400     nx_system_initialize();
401 
402     /* Create the server packet pool.  */
403     status =  nx_packet_pool_create(&server_pool, "HTTP Server Packet Pool", SERVER_PACKET_SIZE,
404                                     pointer, SERVER_PACKET_SIZE*16);
405     pointer = pointer + SERVER_PACKET_SIZE * 16;
406     if (status)
407         error_counter++;
408 
409     /* Create an IP instance.  */
410     status = nx_ip_create(&server_ip, "HTTP Server IP", HTTP_SERVER_ADDRESS,
411                           0xFFFFFF00UL, &server_pool, _nx_ram_network_driver,
412                           pointer, 4096, 1);
413     pointer =  pointer + 4096;
414     if (status)
415         error_counter++;
416 
417     /* Enable ARP and supply ARP cache memory for the server IP instance.  */
418     status = nx_arp_enable(&server_ip, (void *) pointer, 1024);
419     pointer = pointer + 1024;
420     if (status)
421         error_counter++;
422 
423      /* Enable TCP traffic.  */
424     status = nx_tcp_enable(&server_ip);
425     if (status)
426         error_counter++;
427 
428     /* Create the HTTP Client thread. */
429     status = tx_thread_create(&client_thread, "HTTP Client", https_client_thread_entry, 0,
430                               pointer, DEMO_STACK_SIZE,
431                               6, 6, TX_NO_TIME_SLICE, TX_AUTO_START);
432     pointer =  pointer + DEMO_STACK_SIZE;
433     if (status)
434         error_counter++;
435 
436     /* Create the Client packet pool.  */
437     status =  nx_packet_pool_create(&client_pool, "HTTP Client Packet Pool", CLIENT_PACKET_SIZE,
438                                     pointer, CLIENT_PACKET_SIZE*16);
439     pointer = pointer + CLIENT_PACKET_SIZE * 16;
440     if (status)
441         error_counter++;
442 
443     /* Create an IP instance.  */
444     status = nx_ip_create(&client_ip, "HTTP Client IP", HTTP_CLIENT_ADDRESS,
445                           0xFFFFFF00UL, &client_pool, _nx_ram_network_driver,
446                           pointer, 2048, 1);
447     pointer =  pointer + 2048;
448     if (status)
449         error_counter++;
450 
451     status  = nx_arp_enable(&client_ip, (void *) pointer, 1024);
452     pointer =  pointer + 2048;
453     if (status)
454         error_counter++;
455 
456      /* Enable TCP traffic.  */
457     status = nx_tcp_enable(&client_ip);
458     if (status)
459         error_counter++;
460 }
461 
462 
463 /* Define the application's authentication check.  This is called by
464    the HTTP server whenever a new request is received.  */
authentication_check(NX_WEB_HTTP_SERVER * server_ptr,UINT request_type,CHAR * resource,CHAR ** name,CHAR ** password,CHAR ** realm)465 UINT  authentication_check(NX_WEB_HTTP_SERVER *server_ptr, UINT request_type,
466                            CHAR *resource, CHAR **name, CHAR **password, CHAR **realm)
467 {
468     NX_PARAMETER_NOT_USED(server_ptr);
469     NX_PARAMETER_NOT_USED(request_type);
470     NX_PARAMETER_NOT_USED(resource);
471 
472     /* Just use a simple name, password, and realm for all
473        requests and resources.  */
474     *name =     "name";
475     *password = "password";
476     *realm =    "NetX Duo HTTP demo";
477 
478     /* Request basic authentication.  */
479     return(NX_WEB_HTTP_BASIC_AUTHENTICATE);
480 }
481 
482 #ifdef NX_WEB_HTTPS_ENABLE
483 /* Callback to setup TLS parameters for secure HTTPS. */
tls_setup_callback(NX_WEB_HTTP_CLIENT * client_ptr,NX_SECURE_TLS_SESSION * tls_session)484 UINT tls_setup_callback(NX_WEB_HTTP_CLIENT *client_ptr, NX_SECURE_TLS_SESSION *tls_session)
485 {
486 UINT status;
487 
488     NX_PARAMETER_NOT_USED(client_ptr);
489 
490     /* Initialize and create TLS session. */
491     status = nx_secure_tls_session_create(tls_session, &nx_crypto_tls_ciphers, crypto_metadata_client, sizeof(crypto_metadata_client));
492 
493     /* Check status.  */
494     if (status != NX_SUCCESS)
495     {
496         return(status);
497     }
498 
499     /* Allocate space for packet reassembly. */
500     status = nx_secure_tls_session_packet_buffer_set(tls_session, tls_packet_buffer, sizeof(tls_packet_buffer));
501 
502     /* Check status.  */
503     if (status != NX_SUCCESS)
504     {
505         return(status);
506     }
507 
508     /* Add a CA Certificate to our trusted store for verifying incoming server certificates. */
509     nx_secure_x509_certificate_initialize(&trusted_certificate, ca_cert_der, (USHORT)ca_cert_der_len, NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
510     nx_secure_tls_trusted_certificate_add(tls_session, &trusted_certificate);
511 
512         /* Need to allocate space for the certificate coming in from the remote host. */
513     nx_secure_tls_remote_certificate_allocate(tls_session, &remote_certificate, remote_cert_buffer, sizeof(remote_cert_buffer));
514     nx_secure_tls_remote_certificate_allocate(tls_session, &remote_issuer, remote_issuer_buffer, sizeof(remote_issuer_buffer));
515 
516     return(NX_SUCCESS);
517 }
518 #endif
519 
520 /* Callback invoked when HTTP(S) client processes a response header. This
521    example shows how the HTTP headers are extracted. */
http_response_callback(NX_WEB_HTTP_CLIENT * client_ptr,CHAR * field_name,UINT field_name_length,CHAR * field_value,UINT field_value_length)522 VOID http_response_callback(NX_WEB_HTTP_CLIENT *client_ptr, CHAR *field_name, UINT field_name_length,
523                             CHAR *field_value, UINT field_value_length)
524 {
525 CHAR name[100];
526 CHAR value[100];
527 
528     NX_PARAMETER_NOT_USED(client_ptr);
529 
530     if (field_name_length >= sizeof(name) ||
531         field_value_length >= sizeof(value))
532     {
533         return;
534     }
535 
536     memset(name, 0, sizeof(name));
537     memset(value, 0, sizeof(value));
538 
539     memcpy(name, field_name, field_name_length); /* Use case of memcpy is verified. */
540     memcpy(value, field_value, field_value_length); /* Use case of memcpy is verified. */
541 
542     printf("Received header: \n\tField name: %s (%d bytes)\n\tValue: %s (%d bytes)\n--------------\n",
543             name, field_name_length, value, field_value_length);
544 }
545 
546 /* Thread entry for the HTTP(S) Client demo. */
https_client_thread_entry(ULONG thread_input)547 VOID https_client_thread_entry(ULONG thread_input)
548 {
549 UINT            status;
550 UINT            get_status;
551 NX_PACKET      *receive_packet;
552 UCHAR           receive_buffer[1000];
553 ULONG           bytes;
554 
555 
556     NX_PARAMETER_NOT_USED(thread_input);
557 
558     /* Give IP task and driver a chance to initialize the system. */
559     tx_thread_sleep( NX_IP_PERIODIC_RATE);
560 
561     /* Create an HTTP client instance.  */
562     status = nx_web_http_client_create(&my_client, "HTTP Client", &client_ip, &client_pool, 1536);
563 
564     /* GET the test page */
565     /* Use the 'NetX' service to send a GET request to the server (can only use IPv4 addresses). */
566     server_ip_address.nxd_ip_address.v4 = HTTP_SERVER_ADDRESS;
567     server_ip_address.nxd_ip_version = NX_IP_VERSION_V4;
568 
569     /* Set the header callback routine. */
570     nx_web_http_client_response_header_callback_set(&my_client, http_response_callback);
571 
572 
573 #ifdef NX_WEB_SIMPLE_HTTPS_GET_DEMO
574     /* This is a fully-contained GET request API. Alternatively, you can build custom requests
575        with the nx_web_http_client_connect API used below. */
576 #ifdef NX_WEB_HTTPS_ENABLE
577     status =  nx_web_http_client_get_secure_start(&my_client, &server_ip_address, NX_WEB_HTTPS_SERVER_PORT,
578                                                   "/test.txt.large",
579                                                    "192.168.1.150", "name", "password",
580                                                    tls_setup_callback, NX_WAIT_FOREVER);
581 #else
582     status =  nx_web_http_client_get_start(&my_client, &server_ip_address, NX_WEB_HTTP_SERVER_PORT,
583                                            "/test.txt.large",
584                                            "192.168.1.150", "name", "password",
585                                            NX_WAIT_FOREVER);
586 #endif
587 
588 #else /* NX_WEB_SIMPLE_HTTPS_GET_DEMO */
589 
590 #ifdef NX_WEB_HTTPS_ENABLE
591     status = nx_web_http_client_secure_connect(&my_client, &server_ip_address, NX_WEB_HTTPS_SERVER_PORT,
592                                                 tls_setup_callback, NX_WAIT_FOREVER);
593 #else
594     status = nx_web_http_client_connect(&my_client, &server_ip_address, NX_WEB_HTTP_SERVER_PORT,
595                                         NX_WAIT_FOREVER);
596 #endif
597     /* Check status.  */
598     if (status != NX_SUCCESS)
599     {
600         printf("Error in HTTPS Connect: 0x%x\n", status);
601         return;
602     }
603 
604     /* Initialize HTTP request. */
605     status = nx_web_http_client_request_initialize(&my_client,
606                                                    NX_WEB_HTTP_METHOD_GET, /* GET, PUT, DELETE, POST, HEAD */
607                                                    "/test.txt",
608                                                     "192.168.1.150",
609                                                     0, /* Used by PUT and POST */
610                                                     NX_FALSE, /* If true, input_size is ignored. */
611                                                     "name", //"name",
612                                                     "password", // "password",
613                                                     NX_WAIT_FOREVER);
614     /* Check status.  */
615     if (status != NX_SUCCESS)
616     {
617         printf("Error in HTTPS request intialization: 0x%x\n", status);
618         return;
619     }
620 
621     /* Send the HTTP request we just built. */
622     status = nx_web_http_client_request_send(&my_client, NX_WAIT_FOREVER);
623 
624     /* Check status.  */
625     if (status != NX_SUCCESS)
626     {
627         printf("Error in HTTPS request send: 0x%x\n", status);
628         return;
629     }
630 #endif
631 
632     /* Receive response data from the server. Loop until all data is received. */
633     get_status = NX_SUCCESS;
634     while(get_status != NX_WEB_HTTP_GET_DONE)
635     {
636         get_status = nx_web_http_client_response_body_get(&my_client, &receive_packet, NX_WAIT_FOREVER);
637 
638         /* Check for error.  */
639         if (get_status != NX_SUCCESS && get_status != NX_WEB_HTTP_GET_DONE)
640         {
641             printf("HTTPS get packet failed, error: 0x%x\n", get_status);
642             return;
643         }
644         else
645         {
646             status = nx_packet_data_extract_offset(receive_packet, 0, receive_buffer, 100, &bytes);
647             if(status)
648             {
649                 printf("Error in extracting response body data: 0x%x\n", status);
650             }
651             receive_buffer[bytes] = 0;
652             printf("Received data: %s\n", receive_buffer);
653             nx_packet_release(receive_packet);
654         }
655     }
656 
657     /* Clear out the HTTP client when we are done. */
658     status = nx_web_http_client_delete(&my_client);
659 
660     return;
661 }
662 
663 /************* HTTP(S) Server *************************/
664 
665 /* Server request callback is invoked whenever an HTTP(S) client
666    sends a request to the server port. */
server_request_callback(NX_WEB_HTTP_SERVER * server_ptr,UINT request_type,CHAR * resource,NX_PACKET * packet_ptr)667 UINT server_request_callback(NX_WEB_HTTP_SERVER *server_ptr, UINT request_type, CHAR *resource, NX_PACKET *packet_ptr)
668 {
669 NX_PACKET   *response_pkt;
670 UINT         status;
671 CHAR         response[] = "Test response from server";
672 
673     NX_PARAMETER_NOT_USED(resource);
674 
675     /* Process GET request. */
676     if(request_type == NX_WEB_HTTP_SERVER_GET_REQUEST)
677     {
678 
679        /* Generate HTTP header.  */
680         status = nx_web_http_server_callback_generate_response_header(server_ptr,
681                                                                       &response_pkt, NX_WEB_HTTP_STATUS_OK, sizeof(response) - 1, "text/htm",
682                                                                       NX_NULL);
683         if (status)
684         {
685             return(status);
686         }
687 
688         nx_packet_data_append(response_pkt, response, sizeof(response) - 1, server_ptr -> nx_web_http_server_packet_pool_ptr, NX_WAIT_FOREVER);
689 
690         status = nx_web_http_server_callback_packet_send(server_ptr, response_pkt);
691         if (status)
692         {
693             nx_packet_release(response_pkt);
694             return(status);
695         }
696 
697     }
698     else
699     {
700         /* Indicate we have not processed the response to client yet.*/
701         return(NX_SUCCESS);
702     }
703 
704     /* Indicate the response to client is transmitted. */
705     return(NX_WEB_HTTP_CALLBACK_COMPLETED);
706 
707 }
708 
709 /* Define the helper HTTP server thread.  */
https_server_thread_entry(ULONG thread_input)710 void    https_server_thread_entry(ULONG thread_input)
711 {
712 UINT            status;
713 UINT            server_port;
714 
715 
716 
717     NX_PARAMETER_NOT_USED(thread_input);
718 
719 
720     fx_media_format(&ram_disk,
721                     _fx_ram_driver,               // Driver entry
722                     ram_disk_memory,              // RAM disk memory pointer
723                     media_memory,              // Media buffer pointer
724                     sizeof(media_memory),      // Media buffer size
725                     "MY_RAM_DISK",                // Volume Name
726                     1,                            // Number of FATs
727                     32,                           // Directory Entries
728                     0,                            // Hidden sectors
729                     256,                          // Total sectors
730                     512,                          // Sector size
731                     8,                            // Sectors per cluster
732                     1,                            // Heads
733                     1);                           // Sectors per track
734 
735     /* Open the RAM disk.  */
736     fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, media_memory, sizeof(media_memory)) ;
737 
738     fx_file_create(&ram_disk, "TEST.TXT");
739 
740     /* Give NetX a chance to initialize the system. */
741     tx_thread_sleep(NX_IP_PERIODIC_RATE);
742 
743 #ifdef NX_WEB_HTTPS_ENABLE
744     server_port = NX_WEB_HTTPS_SERVER_PORT;
745 #else
746     server_port = NX_WEB_HTTP_SERVER_PORT;
747 #endif
748 
749     /* Create the HTTPS Server. */
750     status = nx_web_http_server_create(&my_server, "My HTTP Server", &server_ip, server_port, &ram_disk,
751                                         &server_stack, sizeof(server_stack), &server_pool,
752                                         authentication_check, server_request_callback);
753 
754     if (status != NX_SUCCESS)
755     {
756         printf("HTTPS web server create failed, error: %x\n", status);
757         return;
758     }
759 
760 #ifdef NX_WEB_HTTPS_ENABLE
761 
762     /* Initialize device certificate (used for all sessions in HTTPS server). */
763     memset(&certificate, 0, sizeof(certificate));
764     nx_secure_x509_certificate_initialize(&certificate, test_device_cert_der, (USHORT)test_device_cert_der_len, NX_NULL, 0, test_device_cert_key_der, (USHORT)test_device_cert_key_der_len, NX_SECURE_X509_KEY_TYPE_RSA_PKCS1_DER);
765 
766     /* Setup TLS session data for the TCP server. */
767     status = nx_web_http_server_secure_configure(&my_server, &nx_crypto_tls_ciphers,
768                                                  crypto_metadata_server, sizeof(crypto_metadata_server), tls_packet_buffer, sizeof(tls_packet_buffer),
769                                                  &certificate, NX_NULL, 0, NX_NULL, 0, NX_NULL, 0);
770 
771     if (status != NX_SUCCESS)
772     {
773         printf("HTTPS web server TLS configuration failed, error: %x\n", status);
774         return;
775     }
776 #endif
777 
778     /* Start an HTTPS Server with TLS.  */
779     status = nx_web_http_server_start(&my_server);
780 
781     if (status != NX_SUCCESS)
782     {
783         printf("HTTPS web server start failed, error: %x\n", status);
784         return;
785     }
786 
787     /* HTTP server ready to take requests! */
788 
789     /* Let the IP thread execute.    */
790     tx_thread_sleep(NX_IP_PERIODIC_RATE);
791 
792     /* Main application loop. Requests are handled in the request callback. */
793     while(1)
794     {
795         tx_thread_sleep(NX_IP_PERIODIC_RATE);
796     }
797 }
798 #endif /* NX_DISABLE_IPV4  */
799