64
64
#define ADU_DEVICE_SHA_SIZE 32
65
65
#define ADU_SHA_PARTITION_READ_BUFFER_SIZE 32
66
66
#define HTTP_DOWNLOAD_CHUNK 4096
67
- #define ADU_PNP_ACCEPT_CODE 200
68
- #define ADU_PNP_REJECT_CODE 406
69
67
70
68
// ADU Feature Values
71
69
static az_iot_adu_client adu_client;
72
70
static az_iot_adu_client_update_request adu_update_request;
73
71
static az_iot_adu_client_update_manifest adu_update_manifest;
74
72
static char adu_new_version[16 ];
75
73
static bool process_update_request = false ;
74
+ static bool send_init_state = true ;
76
75
static bool did_update = false ;
77
76
static char adu_scratch_buffer[10000 ];
78
77
static char adu_manifest_unescape_buffer[2000 ];
@@ -83,12 +82,7 @@ static char partition_read_buffer[ADU_SHA_PARTITION_READ_BUFFER_SIZE];
83
82
static int chunked_data_index;
84
83
85
84
static az_span pnp_components[] = { AZ_SPAN_FROM_STR (AZ_IOT_ADU_CLIENT_PROPERTIES_COMPONENT_NAME) };
86
- az_iot_adu_client_device_properties adu_device_information
87
- = { .manufacturer = AZ_SPAN_LITERAL_FROM_STR (ADU_DEVICE_MANUFACTURER),
88
- .model = AZ_SPAN_LITERAL_FROM_STR (ADU_DEVICE_MODEL),
89
- .adu_version = AZ_SPAN_LITERAL_FROM_STR (AZ_IOT_ADU_CLIENT_AGENT_VERSION),
90
- .delivery_optimization_agent_version = AZ_SPAN_EMPTY,
91
- .update_id = AZ_SPAN_LITERAL_FROM_STR (ADU_UPDATE_ID) };
85
+ static az_iot_adu_client_device_properties adu_device_information;
92
86
93
87
// Utility macros and defines
94
88
#define sizeofarray (a ) (sizeof (a) / sizeof (a[0 ]))
@@ -142,6 +136,90 @@ static AzIoTSasToken sasToken(
142
136
AZ_SPAN_FROM_BUFFER(mqtt_password));
143
137
#endif // IOT_CONFIG_USE_X509_CERT
144
138
139
+ /* Azure Device Update root keys used to verify the signed deployment */
140
+ /* ADU.200702.R */
141
+ static uint8_t ucAzureIoTADURootKeyId200702[ 13 ] = " ADU.200702.R" ;
142
+ static uint8_t ucAzureIoTADURootKeyN200702[ 385 ]
143
+ =
144
+ {
145
+ 0x00 , 0xd5 , 0x42 , 0x2e , 0xaf , 0x11 , 0x54 , 0xa3 , 0x50 , 0x65 , 0x87 , 0xa2 , 0x4d , 0x5b , 0xba ,
146
+ 0x1a , 0xfb , 0xa9 , 0x32 , 0xdf , 0xe9 , 0x99 , 0x5f , 0x05 , 0x45 , 0xc8 , 0xaf , 0xbd , 0x35 , 0x1d ,
147
+ 0x89 , 0xe8 , 0x27 , 0x27 , 0x58 , 0xa3 , 0xa8 , 0xee , 0xc5 , 0xc5 , 0x1e , 0x4f , 0xf7 , 0x92 , 0xa6 ,
148
+ 0x12 , 0x06 , 0x7d , 0x3d , 0x7d , 0xb0 , 0x07 , 0xf6 , 0x2c , 0x7f , 0xde , 0x6d , 0x2a , 0xf5 , 0xbc ,
149
+ 0x49 , 0xbc , 0x15 , 0xef , 0xf0 , 0x81 , 0xcb , 0x3f , 0x88 , 0x4f , 0x27 , 0x1d , 0x88 , 0x71 , 0x28 ,
150
+ 0x60 , 0x08 , 0xb6 , 0x19 , 0xd2 , 0xd2 , 0x39 , 0xd0 , 0x05 , 0x1f , 0x3c , 0x76 , 0x86 , 0x71 , 0xbb ,
151
+ 0x59 , 0x58 , 0xbc , 0xb1 , 0x88 , 0x7b , 0xab , 0x56 , 0x28 , 0xbf , 0x31 , 0x73 , 0x44 , 0x32 , 0x10 ,
152
+ 0xfd , 0x3d , 0xd3 , 0x96 , 0x5c , 0xff , 0x4e , 0x5c , 0xb3 , 0x6b , 0xff , 0x8b , 0x84 , 0x9b , 0x8b ,
153
+ 0x80 , 0xb8 , 0x49 , 0xd0 , 0x7d , 0xfa , 0xd6 , 0x40 , 0x58 , 0x76 , 0x4d , 0xc0 , 0x72 , 0x27 , 0x75 ,
154
+ 0xcb , 0x9a , 0x2f , 0x9b , 0xb4 , 0x9f , 0x0f , 0x25 , 0xf1 , 0x1c , 0xc5 , 0x1b , 0x0b , 0x5a , 0x30 ,
155
+ 0x7d , 0x2f , 0xb8 , 0xef , 0xa7 , 0x26 , 0x58 , 0x53 , 0xaf , 0xd5 , 0x1d , 0x55 , 0x01 , 0x51 , 0x0d ,
156
+ 0xe9 , 0x1b , 0xa2 , 0x0f , 0x3f , 0xd7 , 0xe9 , 0x1d , 0x20 , 0x41 , 0xa6 , 0xe6 , 0x14 , 0x0a , 0xae ,
157
+ 0xfe , 0xf2 , 0x1c , 0x2a , 0xd6 , 0xe4 , 0x04 , 0x7b , 0xf6 , 0x14 , 0x7e , 0xec , 0x0f , 0x97 , 0x83 ,
158
+ 0xfa , 0x58 , 0xfa , 0x81 , 0x36 , 0x21 , 0xb9 , 0xa3 , 0x2b , 0xfa , 0xd9 , 0x61 , 0x0b , 0x1a , 0x94 ,
159
+ 0xf7 , 0xc1 , 0xbe , 0x7f , 0x40 , 0x14 , 0x4a , 0xc9 , 0xfa , 0x35 , 0x7f , 0xef , 0x66 , 0x70 , 0x00 ,
160
+ 0xb1 , 0xfd , 0xdb , 0xd7 , 0x61 , 0x0d , 0x3b , 0x58 , 0x74 , 0x67 , 0x94 , 0x89 , 0x75 , 0x76 , 0x96 ,
161
+ 0x7c , 0x91 , 0x87 , 0xd2 , 0x8e , 0x11 , 0x97 , 0xee , 0x7b , 0x87 , 0x6c , 0x9a , 0x2f , 0x45 , 0xd8 ,
162
+ 0x65 , 0x3f , 0x52 , 0x70 , 0x98 , 0x2a , 0xcb , 0xc8 , 0x04 , 0x63 , 0xf5 , 0xc9 , 0x47 , 0xcf , 0x70 ,
163
+ 0xf4 , 0xed , 0x64 , 0xa7 , 0x74 , 0xa5 , 0x23 , 0x8f , 0xb6 , 0xed , 0xf7 , 0x1c , 0xd3 , 0xb0 , 0x1c ,
164
+ 0x64 , 0x57 , 0x12 , 0x5a , 0xa9 , 0x81 , 0x84 , 0x1f , 0xa0 , 0xe7 , 0x50 , 0x19 , 0x96 , 0xb4 , 0x82 ,
165
+ 0xb1 , 0xac , 0x48 , 0xe3 , 0xe1 , 0x32 , 0x82 , 0xcb , 0x40 , 0x1f , 0xac , 0xc4 , 0x59 , 0xbc , 0x10 ,
166
+ 0x34 , 0x51 , 0x82 , 0xf9 , 0x28 , 0x8d , 0xa8 , 0x1e , 0x9b , 0xf5 , 0x79 , 0x45 , 0x75 , 0xb2 , 0xdc ,
167
+ 0x9a , 0x11 , 0x43 , 0x08 , 0xbe , 0x61 , 0xcc , 0x9a , 0xc4 , 0xcb , 0x77 , 0x36 , 0xff , 0x83 , 0xdd ,
168
+ 0xa8 , 0x71 , 0x4f , 0x51 , 0x8e , 0x0e , 0x7b , 0x4d , 0xfa , 0x79 , 0x98 , 0x8d , 0xbe , 0xfc , 0x82 ,
169
+ 0x7e , 0x40 , 0x48 , 0xa9 , 0x12 , 0x01 , 0xa8 , 0xd9 , 0x7e , 0xf3 , 0xa5 , 0x1b , 0xf1 , 0xfb , 0x90 ,
170
+ 0x77 , 0x3e , 0x40 , 0x87 , 0x18 , 0xc9 , 0xab , 0xd9 , 0xf7 , 0x79
171
+ };
172
+ static uint8_t ucAzureIoTADURootKeyE200702[ 3 ] = { 0x01 , 0x00 , 0x01 };
173
+
174
+ /* ADU.200703.R */
175
+ static uint8_t ucAzureIoTADURootKeyId200703[ 13 ] = " ADU.200703.R" ;
176
+ static uint8_t ucAzureIoTADURootKeyN200703[ 385 ] =
177
+ {
178
+ 0x00 , 0xb2 , 0xa3 , 0xb2 , 0x74 , 0x16 , 0xfa , 0xbb , 0x20 , 0xf9 , 0x52 , 0x76 , 0xe6 , 0x27 , 0x3e ,
179
+ 0x80 , 0x41 , 0xc6 , 0xfe , 0xcf , 0x30 , 0xf9 , 0xc8 , 0x96 , 0xf5 , 0x59 , 0x0a , 0xaa , 0x81 , 0xe7 ,
180
+ 0x51 , 0x83 , 0x8a , 0xc4 , 0xf5 , 0x17 , 0x3a , 0x2f , 0x2a , 0xe6 , 0x57 , 0xd4 , 0x71 , 0xce , 0x8a ,
181
+ 0x3d , 0xef , 0x9a , 0x55 , 0x76 , 0x3e , 0x99 , 0xe2 , 0xc2 , 0xae , 0x4c , 0xee , 0x2d , 0xb8 , 0x78 ,
182
+ 0xf5 , 0xa2 , 0x4e , 0x28 , 0xf2 , 0x9c , 0x4e , 0x39 , 0x65 , 0xbc , 0xec , 0xe4 , 0x0d , 0xe5 , 0xe3 ,
183
+ 0x38 , 0xa8 , 0x59 , 0xab , 0x08 , 0xa4 , 0x1b , 0xb4 , 0xf4 , 0xa0 , 0x52 , 0xa3 , 0x38 , 0xb3 , 0x46 ,
184
+ 0x21 , 0x13 , 0xcc , 0x3c , 0x68 , 0x06 , 0xde , 0xfe , 0x00 , 0xa6 , 0x92 , 0x6e , 0xde , 0x4c , 0x47 ,
185
+ 0x10 , 0xd6 , 0x1c , 0x9c , 0x24 , 0xf5 , 0xcd , 0x70 , 0xe1 , 0xf5 , 0x6a , 0x7c , 0x68 , 0x13 , 0x1d ,
186
+ 0xe1 , 0xc5 , 0xf6 , 0xa8 , 0x4f , 0x21 , 0x9f , 0x86 , 0x7c , 0x44 , 0xc5 , 0x8a , 0x99 , 0x1c , 0xc5 ,
187
+ 0xd3 , 0x06 , 0x9b , 0x5a , 0x71 , 0x9d , 0x09 , 0x1c , 0xc3 , 0x64 , 0x31 , 0x6a , 0xc5 , 0x17 , 0x95 ,
188
+ 0x1d , 0x5d , 0x2a , 0xf1 , 0x55 , 0xc7 , 0x66 , 0xd4 , 0xe8 , 0xf5 , 0xd9 , 0xa9 , 0x5b , 0x8c , 0xa2 ,
189
+ 0x6c , 0x62 , 0x60 , 0x05 , 0x37 , 0xd7 , 0x32 , 0xb0 , 0x73 , 0xcb , 0xf7 , 0x4b , 0x36 , 0x27 , 0x24 ,
190
+ 0x21 , 0x8c , 0x38 , 0x0a , 0xb8 , 0x18 , 0xfe , 0xf5 , 0x15 , 0x60 , 0x35 , 0x8b , 0x35 , 0xef , 0x1e ,
191
+ 0x0f , 0x88 , 0xa6 , 0x13 , 0x8d , 0x7b , 0x7d , 0xef , 0xb3 , 0xe7 , 0xb0 , 0xc9 , 0xa6 , 0x1c , 0x70 ,
192
+ 0x7b , 0xcc , 0xf2 , 0x29 , 0x8b , 0x87 , 0xf7 , 0xbd , 0x9d , 0xb6 , 0x88 , 0x6f , 0xac , 0x73 , 0xff ,
193
+ 0x72 , 0xf2 , 0xef , 0x48 , 0x27 , 0x96 , 0x72 , 0x86 , 0x06 , 0xa2 , 0x5c , 0xe3 , 0x7d , 0xce , 0xb0 ,
194
+ 0x9e , 0xe5 , 0xc2 , 0xd9 , 0x4e , 0xc4 , 0xf3 , 0x7f , 0x78 , 0x07 , 0x4b , 0x65 , 0x88 , 0x45 , 0x0c ,
195
+ 0x11 , 0xe5 , 0x96 , 0x56 , 0x34 , 0x88 , 0x2d , 0x16 , 0x0e , 0x59 , 0x42 , 0xd2 , 0xf7 , 0xd9 , 0xed ,
196
+ 0x1d , 0xed , 0xc9 , 0x37 , 0x77 , 0x44 , 0x7e , 0xe3 , 0x84 , 0x36 , 0x9f , 0x58 , 0x13 , 0xef , 0x6f ,
197
+ 0xe4 , 0xc3 , 0x44 , 0xd4 , 0x77 , 0x06 , 0x8a , 0xcf , 0x5b , 0xc8 , 0x80 , 0x1c , 0xa2 , 0x98 , 0x65 ,
198
+ 0x0b , 0x35 , 0xdc , 0x73 , 0xc8 , 0x69 , 0xd0 , 0x5e , 0xe8 , 0x25 , 0x43 , 0x9e , 0xf6 , 0xd8 , 0xab ,
199
+ 0x05 , 0xaf , 0x51 , 0x29 , 0x23 , 0x55 , 0x40 , 0x58 , 0x10 , 0xea , 0xb8 , 0xe2 , 0xcd , 0x5d , 0x79 ,
200
+ 0xcc , 0xec , 0xdf , 0xb4 , 0x5b , 0x98 , 0xc7 , 0xfa , 0xe3 , 0xd2 , 0x6c , 0x26 , 0xce , 0x2e , 0x2c ,
201
+ 0x56 , 0xe0 , 0xcf , 0x8d , 0xee , 0xfd , 0x93 , 0x12 , 0x2f , 0x00 , 0x49 , 0x8d , 0x1c , 0x82 , 0x38 ,
202
+ 0x56 , 0xa6 , 0x5d , 0x79 , 0x44 , 0x4a , 0x1a , 0xf3 , 0xdc , 0x16 , 0x10 , 0xb3 , 0xc1 , 0x2d , 0x27 ,
203
+ 0x11 , 0xfe , 0x1b , 0x98 , 0x05 , 0xe4 , 0xa3 , 0x60 , 0x31 , 0x99
204
+ };
205
+ static uint8_t ucAzureIoTADURootKeyE200703[ 3 ] = { 0x01 , 0x00 , 0x01 };
206
+
207
+ static SampleJWS::RootKey xADURootKeys[] =
208
+ {
209
+ {
210
+ // Minus one on id to not count NULL
211
+ .root_key_id = az_span_create (ucAzureIoTADURootKeyId200703, sizeof (ucAzureIoTADURootKeyId200703) - 1 ),
212
+ .root_key_n = AZ_SPAN_FROM_BUFFER (ucAzureIoTADURootKeyN200703),
213
+ .root_key_exponent = AZ_SPAN_FROM_BUFFER (ucAzureIoTADURootKeyE200703)
214
+ },
215
+ {
216
+ // Minus one on id to not count NULL
217
+ .root_key_id = az_span_create (ucAzureIoTADURootKeyId200702, sizeof (ucAzureIoTADURootKeyId200702) - 1 ),
218
+ .root_key_n = AZ_SPAN_FROM_BUFFER (ucAzureIoTADURootKeyN200702),
219
+ .root_key_exponent = AZ_SPAN_FROM_BUFFER (ucAzureIoTADURootKeyE200702)
220
+ }
221
+ };
222
+
145
223
static void connect_to_wifi ()
146
224
{
147
225
Logger.Info (" Connecting to WIFI SSID " + String (ssid));
@@ -360,7 +438,7 @@ static void request_all_properties(void)
360
438
361
439
// send_adu_device_reported_property writes a property payload reporting device
362
440
// state and then sends it to Azure IoT Hub.
363
- static void send_adu_device_information_property (int32_t agent_state, az_iot_adu_client_workflow * workflow)
441
+ static void send_adu_device_information_property (az_iot_adu_client_agent_state agent_state, az_iot_adu_client_workflow * workflow)
364
442
{
365
443
az_result rc;
366
444
@@ -423,7 +501,7 @@ static void send_adu_device_information_property(int32_t agent_state, az_iot_adu
423
501
}
424
502
425
503
static void send_adu_accept_manifest_property (int32_t version_number,
426
- int32_t response_code)
504
+ az_iot_adu_client_request_decision response_code)
427
505
{
428
506
az_result rc;
429
507
@@ -546,7 +624,7 @@ static void process_device_property_message(
546
624
}
547
625
else
548
626
{
549
- if (adu_update_request.workflow .action != AZ_IOT_ADU_CLIENT_SERVICE_ACTION_CANCEL )
627
+ if (adu_update_request.workflow .action == AZ_IOT_ADU_CLIENT_SERVICE_ACTION_APPLY_DEPLOYMENT )
550
628
{
551
629
rc = az_json_string_unescape (adu_update_request.update_manifest , (char *)adu_manifest_unescape_buffer, sizeof (adu_manifest_unescape_buffer), &out_manifest_size);
552
630
@@ -580,6 +658,7 @@ static void process_device_property_message(
580
658
rc = SampleJWS::ManifestAuthenticate (
581
659
manifest_unescaped,
582
660
adu_update_request.update_manifest_signature ,
661
+ &xADURootKeys[0 ], sizeof (xADURootKeys) / sizeof (xADURootKeys[0 ]),
583
662
AZ_SPAN_FROM_BUFFER (adu_verification_buffer));
584
663
if (az_result_failed (rc))
585
664
{
@@ -593,20 +672,30 @@ static void process_device_property_message(
593
672
if (is_update_already_applied ())
594
673
{
595
674
Logger.Info (" Update already applied" );
596
- send_adu_accept_manifest_property (version_number, ADU_PNP_REJECT_CODE );
675
+ send_adu_accept_manifest_property (version_number, AZ_IOT_ADU_CLIENT_REQUEST_DECISION_REJECT );
597
676
process_update_request = false ;
598
677
}
599
678
else
600
679
{
601
680
Logger.Info (" Sending manifest property accept" );
602
- send_adu_accept_manifest_property (version_number, ADU_PNP_ACCEPT_CODE );
681
+ send_adu_accept_manifest_property (version_number, AZ_IOT_ADU_CLIENT_REQUEST_DECISION_ACCEPT );
603
682
604
683
process_update_request = true ;
605
684
}
606
685
}
607
- else
686
+ else if (adu_update_request. workflow . action == AZ_IOT_ADU_CLIENT_SERVICE_ACTION_CANCEL)
608
687
{
609
688
Logger.Info (" ADU action received: cancelled deployment" );
689
+ send_adu_device_information_property (AZ_IOT_ADU_CLIENT_AGENT_STATE_IDLE, NULL );
690
+ process_update_request = false ;
691
+ }
692
+ else
693
+ {
694
+ Logger.Error (" Unknown workflow action received: " + String (adu_update_request.workflow .action ));
695
+
696
+ send_adu_device_information_property (AZ_IOT_ADU_CLIENT_AGENT_STATE_FAILED, &adu_update_request.workflow );
697
+
698
+ process_update_request = false ;
610
699
}
611
700
}
612
701
}
@@ -985,9 +1074,16 @@ static void send_telemetry()
985
1074
986
1075
// Arduino setup and loop main functions.
987
1076
988
- void setup () { establish_connection (); }
1077
+ void setup () {
1078
+ adu_device_information = az_iot_adu_client_device_properties_default ();
1079
+ adu_device_information.manufacturer = AZ_SPAN_FROM_STR (ADU_DEVICE_MANUFACTURER);
1080
+ adu_device_information.model = AZ_SPAN_FROM_STR (ADU_DEVICE_MODEL);
1081
+ adu_device_information.adu_version = AZ_SPAN_FROM_STR (AZ_IOT_ADU_CLIENT_AGENT_VERSION);
1082
+ adu_device_information.delivery_optimization_agent_version = AZ_SPAN_EMPTY;
1083
+ adu_device_information.update_id = AZ_SPAN_FROM_STR (ADU_UPDATE_ID);
989
1084
990
- bool send_init_state = true ;
1085
+ establish_connection ();
1086
+ }
991
1087
992
1088
void loop ()
993
1089
{
@@ -1034,9 +1130,10 @@ void loop()
1034
1130
{
1035
1131
Logger.Info (" Cancellation request was received during download. "
1036
1132
" Aborting update." );
1133
+ send_adu_device_information_property (AZ_IOT_ADU_CLIENT_AGENT_STATE_IDLE, NULL );
1037
1134
process_update_request = false ;
1038
1135
}
1039
- else
1136
+ else if (adu_update_request. workflow . action == AZ_IOT_ADU_CLIENT_SERVICE_ACTION_APPLY_DEPLOYMENT)
1040
1137
{
1041
1138
result = verify_image (
1042
1139
adu_update_manifest.files [0 ].hashes ->hash_value ,
@@ -1052,6 +1149,14 @@ void loop()
1052
1149
esp_restart ();
1053
1150
}
1054
1151
}
1152
+ else
1153
+ {
1154
+ Logger.Error (" Unknown workflow action received: " + String (adu_update_request.workflow .action ));
1155
+
1156
+ send_adu_device_information_property (AZ_IOT_ADU_CLIENT_AGENT_STATE_FAILED, &adu_update_request.workflow );
1157
+
1158
+ process_update_request = false ;
1159
+ }
1055
1160
}
1056
1161
}
1057
1162
}
0 commit comments