1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 #include <stdio.h>
12 #include <setjmp.h>
13 #include <cmocka.h>  /* macros: https://api.cmocka.org/group__cmocka__asserts.html */
14 
15 #include "nx_api.h"
16 #include "nx_azure_iot_hub_client.h"
17 #include "nx_azure_iot_cert.h"
18 #include "nx_azure_iot_ciphersuites.h"
19 #include "nx_azure_iot_provisioning_client.h"
20 
21 
22 #define DEMO_DHCP_DISABLE
23 #define DEMO_IPV4_ADDRESS         IP_ADDRESS(192, 168, 100, 33)
24 #define DEMO_IPV4_MASK            0xFFFFFF00UL
25 #define DEMO_GATEWAY_ADDRESS      IP_ADDRESS(192, 168, 100, 1)
26 #define DEMO_DNS_SERVER_ADDRESS   IP_ADDRESS(192, 168, 100, 1)
27 #define NETWORK_DRIVER            _nx_ram_network_driver
28 
29 /* Include main.c in the test case since we need to disable DHCP in this test. */
30 #include "main.c"
31 
32 
33 #define STRING_UNSIGNED_ARGS(s) (UCHAR *)s, strlen(s)
34 
35 #ifndef DEMO_CLOUD_STACK_SIZE
36 #define DEMO_CLOUD_STACK_SIZE   2048
37 #endif /* DEMO_CLOUD_STACK_SIZE */
38 
39 #ifndef DEMO_CLOUD_THREAD_PRIORITY
40 #define DEMO_CLOUD_THREAD_PRIORITY  (4)
41 #endif /* DEMO_CLOUD_THREAD_PRIORITY */
42 
43 static NX_AZURE_IOT iot;
44 static NX_AZURE_IOT_HUB_CLIENT iot_client;
45 static NX_AZURE_IOT_PROVISIONING_CLIENT iot_prov_client;
46 static NX_SECURE_X509_CERT root_ca_cert;
47 static NX_SECURE_X509_CERT root_ca_cert_2;
48 static NX_SECURE_X509_CERT root_ca_cert_3;
49 static NX_SECURE_X509_CERT root_ca_cert_4;
50 static UCHAR metadata_buffer[NX_AZURE_IOT_TLS_METADATA_BUFFER_SIZE];
51 static ULONG demo_cloud_thread_stack[DEMO_CLOUD_STACK_SIZE / sizeof(ULONG)];
52 static NX_PACKET *allocated_packets[256];
53 static UCHAR large_property_name[2048];
54 static ULONG small_pool_stack[1024 >> 2];
55 static NX_PACKET_POOL small_pool;
56 extern int g_argc;
57 extern char **g_argv;
58 
59 CHAR *expected_topic = "";
60 CHAR *expected_message = "";
61 
demo_entry(NX_IP * ip_ptr,NX_PACKET_POOL * pool_ptr,NX_DNS * dns_ptr,UINT (* unix_time_callback)(ULONG * unix_time))62 VOID demo_entry(NX_IP* ip_ptr, NX_PACKET_POOL* pool_ptr, NX_DNS* dns_ptr, UINT (*unix_time_callback)(ULONG *unix_time))
63 {
64 CHAR *host_name = "host_name";
65 CHAR *device_id = "device_id";
66 CHAR *module_id = "module_id";
67 CHAR *endpoint = "host_name";
68 CHAR *id_scope = "id_scope";
69 CHAR *reg_id = "reg_id";
70 
71     assert_int_equal(nx_packet_pool_create(&small_pool, "Small Packet Pool", 4,
72                                            (UCHAR *)small_pool_stack , sizeof(small_pool_stack)),
73                      NX_AZURE_IOT_SUCCESS);
74 
75     /* Initialize root certificate.  */
76     assert_int_equal(nx_secure_x509_certificate_initialize(&root_ca_cert, (UCHAR *)_nx_azure_iot_root_cert, (USHORT)_nx_azure_iot_root_cert_size,
77                                                            NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE),
78                      NX_AZURE_IOT_SUCCESS);
79     assert_int_equal(nx_secure_x509_certificate_initialize(&root_ca_cert_2, (UCHAR *)_nx_azure_iot_root_cert_2, (USHORT)_nx_azure_iot_root_cert_size_2,
80                                                            NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE),
81                      NX_AZURE_IOT_SUCCESS);
82     assert_int_equal(nx_secure_x509_certificate_initialize(&root_ca_cert_2, (UCHAR *)_nx_azure_iot_root_cert_3, (USHORT)_nx_azure_iot_root_cert_size_3,
83                                                            NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE),
84                      NX_AZURE_IOT_SUCCESS);
85 
86     assert_int_equal(nx_azure_iot_create(&iot, (UCHAR *)"Azure IoT", ip_ptr, pool_ptr, dns_ptr, (UCHAR *)demo_cloud_thread_stack,
87                                          sizeof(demo_cloud_thread_stack), DEMO_CLOUD_THREAD_PRIORITY, unix_time_callback),
88                      NX_AZURE_IOT_SUCCESS);
89 
90     /* Initialize IoT hub client.  */
91     assert_int_equal(nx_azure_iot_hub_client_initialize(&iot_client, &iot,
92                                                         STRING_UNSIGNED_ARGS(host_name),
93                                                         STRING_UNSIGNED_ARGS(device_id),
94                                                         STRING_UNSIGNED_ARGS(""),
95                                                         _nx_azure_iot_tls_supported_crypto,
96                                                         _nx_azure_iot_tls_supported_crypto_size,
97                                                         _nx_azure_iot_tls_ciphersuite_map,
98                                                         _nx_azure_iot_tls_ciphersuite_map_size,
99                                                         metadata_buffer, sizeof(metadata_buffer),
100                                                         &root_ca_cert),
101                      NX_AZURE_IOT_SUCCESS);
102 
103     /* FAIL: hub_client_ptr is NULL. */
104     assert_int_not_equal(nx_azure_iot_hub_client_trusted_cert_add(NX_NULL, &root_ca_cert_2),
105                          NX_AZURE_IOT_SUCCESS);
106 
107     /* FAIL: trusted_certificate is NULL. */
108     assert_int_not_equal(nx_azure_iot_hub_client_trusted_cert_add(&iot_client, NX_NULL),
109                          NX_AZURE_IOT_SUCCESS);
110 
111 #if (NX_AZURE_IOT_MAX_NUM_OF_TRUSTED_CERTS == 3)
112     /* SUCCESS: set trusted certificate again. */
113     assert_int_equal(nx_azure_iot_hub_client_trusted_cert_add(&iot_client, &root_ca_cert_2),
114                      NX_AZURE_IOT_SUCCESS);
115     assert_int_equal(nx_azure_iot_hub_client_trusted_cert_add(&iot_client, &root_ca_cert_3),
116                      NX_AZURE_IOT_SUCCESS);
117 
118     /* FAIL: no more entry for trusted cert. */
119     assert_int_not_equal(nx_azure_iot_hub_client_trusted_cert_add(&iot_client, &root_ca_cert_4),
120                          NX_AZURE_IOT_SUCCESS);
121 #endif
122 
123     /* Deinitialize IoT hub client.  */
124     assert_int_equal(nx_azure_iot_hub_client_deinitialize(&iot_client),
125                      NX_AZURE_IOT_SUCCESS);
126 
127 
128     /* Initialize provisioning client.  */
129     assert_int_equal(nx_azure_iot_provisioning_client_initialize(&iot_prov_client, &iot,
130                                                                  endpoint, sizeof(endpoint) - 1,
131                                                                  id_scope, sizeof(id_scope) - 1,
132                                                                  reg_id, sizeof(reg_id) - 1,
133                                                                  _nx_azure_iot_tls_supported_crypto,
134                                                                  _nx_azure_iot_tls_supported_crypto_size,
135                                                                  _nx_azure_iot_tls_ciphersuite_map,
136                                                                  _nx_azure_iot_tls_ciphersuite_map_size,
137                                                                  metadata_buffer, sizeof(metadata_buffer),
138                                                                  &root_ca_cert),
139                      NX_AZURE_IOT_SUCCESS);
140 
141     /* FAIL: iot_prov_client is NULL. */
142     assert_int_not_equal(nx_azure_iot_provisioning_client_trusted_cert_add(NX_NULL, &root_ca_cert_2),
143                          NX_AZURE_IOT_SUCCESS);
144 
145     /* FAIL: trusted_certificate is NULL. */
146     assert_int_not_equal(nx_azure_iot_provisioning_client_trusted_cert_add(&iot_prov_client, NX_NULL),
147                          NX_AZURE_IOT_SUCCESS);
148 
149 #if (NX_AZURE_IOT_MAX_NUM_OF_TRUSTED_CERTS == 3)
150     /* SUCCESS: set trusted certificate again. */
151     assert_int_equal(nx_azure_iot_provisioning_client_trusted_cert_add(&iot_prov_client, &root_ca_cert_2),
152                      NX_AZURE_IOT_SUCCESS);
153     assert_int_equal(nx_azure_iot_provisioning_client_trusted_cert_add(&iot_prov_client, &root_ca_cert_3),
154                      NX_AZURE_IOT_SUCCESS);
155 
156     /* FAIL: no more entry for trusted cert. */
157     assert_int_not_equal(nx_azure_iot_provisioning_client_trusted_cert_add(&iot_prov_client, &root_ca_cert_4),
158                          NX_AZURE_IOT_SUCCESS);
159 #endif
160 
161     /* Deinitialize IoT provisioning client.  */
162     assert_int_equal(nx_azure_iot_provisioning_client_deinitialize(&iot_prov_client),
163                      NX_AZURE_IOT_SUCCESS);
164 
165 
166     /* SUCCESS: iot is deleted. */
167     assert_int_equal(nx_azure_iot_delete(&iot), NX_AZURE_IOT_SUCCESS);
168 }
169 
170