@@ -54,6 +54,7 @@ typedef struct thread_extension_credentials {
54
54
uint8_t domain_name [16 ]; // Thread CCM domain name
55
55
uint8_t ccm_addr [16 ]; // CCM destination address
56
56
const unsigned char * device_certificate_ptr ; // Pointer to CCM device certificate for Autonomous Enrollment
57
+ unsigned char * domain_ca_certificate_ptr ; // Pointer to Thread CCM domain CA certificate
57
58
unsigned char * domain_certificate_ptr ; // Pointer to Thread CCM domain certificate
58
59
unsigned char * domain_pk_ptr ; // Pointer to Thread domain certificate private key
59
60
const unsigned char * device_pk_ptr ; // Pointer to CCM device certificate private key
@@ -62,6 +63,7 @@ typedef struct thread_extension_credentials {
62
63
63
64
uint16_t device_certificate_len ; // Device certificate length
64
65
uint16_t domain_certificate_len ; // Domain certificate length
66
+ uint16_t domain_ca_certificate_len ; // Domain CA certificate length
65
67
uint16_t device_pk_len ; // Device certificate private key length
66
68
uint16_t domain_pk_len ; // Domain certificate private key length
67
69
uint16_t ccm_port ; // CCM destination port
@@ -74,6 +76,36 @@ typedef struct thread_extension_credentials {
74
76
75
77
#ifdef HAVE_THREAD_V2
76
78
79
+ /* Hardcoded CSR request/privatekey pairs */
80
+ static const unsigned char csr_request [215 ] = {
81
+ 0x30 ,0x81 ,0xd4 ,0x30 ,0x7c ,0x02 ,0x01 ,0x00 ,0x30 ,0x1a ,0x31 ,0x18 ,0x30 ,0x16 ,0x06 ,0x03 ,
82
+ 0x55 ,0x04 ,0x03 ,0x0c ,0x0f ,0x54 ,0x68 ,0x72 ,0x65 ,0x61 ,0x64 ,0x44 ,0x65 ,0x76 ,0x69 ,0x63 ,
83
+ 0x65 ,0x31 ,0x32 ,0x33 ,0x30 ,0x59 ,0x30 ,0x13 ,0x06 ,0x07 ,0x2a ,0x86 ,0x48 ,0xce ,0x3d ,0x02 ,
84
+ 0x01 ,0x06 ,0x08 ,0x2a ,0x86 ,0x48 ,0xce ,0x3d ,0x03 ,0x01 ,0x07 ,0x03 ,0x42 ,0x00 ,0x04 ,0xb1 ,
85
+ 0xab ,0xe8 ,0xa2 ,0xa1 ,0xe6 ,0x62 ,0x5e ,0xae ,0x9e ,0x7e ,0x41 ,0xcf ,0x7e ,0x95 ,0x58 ,0x19 ,
86
+ 0x51 ,0x47 ,0xea ,0x0f ,0xe2 ,0xf8 ,0xc2 ,0x1b ,0x61 ,0xa5 ,0x30 ,0x05 ,0xc0 ,0x91 ,0xb6 ,0x07 ,
87
+ 0xc2 ,0x43 ,0x46 ,0xda ,0x75 ,0xc0 ,0x58 ,0xd8 ,0x08 ,0xa5 ,0xbb ,0xdb ,0xdc ,0x0e ,0xf2 ,0x05 ,
88
+ 0x62 ,0xfb ,0x28 ,0xbb ,0xa7 ,0xd2 ,0x9e ,0xef ,0x8f ,0xbf ,0xba ,0xcd ,0x51 ,0xa5 ,0xfd ,0xa0 ,
89
+ 0x00 ,0x30 ,0x0a ,0x06 ,0x08 ,0x2a ,0x86 ,0x48 ,0xce ,0x3d ,0x04 ,0x03 ,0x02 ,0x03 ,0x48 ,0x00 ,
90
+ 0x30 ,0x45 ,0x02 ,0x20 ,0x4e ,0xb2 ,0x25 ,0x82 ,0x24 ,0xf6 ,0xe1 ,0x51 ,0xd6 ,0x0c ,0x19 ,0x60 ,
91
+ 0x88 ,0xb8 ,0xe2 ,0xfd ,0x90 ,0xd2 ,0xc1 ,0x0f ,0xb0 ,0x4f ,0x8e ,0x73 ,0x13 ,0x5c ,0x9f ,0x42 ,
92
+ 0x09 ,0x68 ,0xdf ,0x05 ,0x02 ,0x21 ,0x00 ,0xc9 ,0xc2 ,0x63 ,0x83 ,0x62 ,0x24 ,0x15 ,0x73 ,0xf1 ,
93
+ 0x63 ,0xea ,0xe3 ,0xd2 ,0xf1 ,0x50 ,0x48 ,0x56 ,0xdf ,0x6b ,0xcf ,0xc4 ,0x31 ,0xc4 ,0xcf ,0xbc ,
94
+ 0x26 ,0xe3 ,0x5a ,0x74 ,0x62 ,0x0f ,0x70
95
+ };
96
+
97
+ static const unsigned char private_key [138 ] = {
98
+ 0x30 ,0x81 ,0x87 ,0x02 ,0x01 ,0x00 ,0x30 ,0x13 ,0x06 ,0x07 ,0x2a ,0x86 ,0x48 ,0xce ,0x3d ,0x02 ,
99
+ 0x01 ,0x06 ,0x08 ,0x2a ,0x86 ,0x48 ,0xce ,0x3d ,0x03 ,0x01 ,0x07 ,0x04 ,0x6d ,0x30 ,0x6b ,0x02 ,
100
+ 0x01 ,0x01 ,0x04 ,0x20 ,0xc4 ,0x65 ,0x01 ,0x7e ,0x81 ,0xaa ,0x16 ,0x93 ,0x31 ,0x7b ,0x37 ,0x07 ,
101
+ 0xc8 ,0x85 ,0x9f ,0xee ,0xf9 ,0x55 ,0x19 ,0x41 ,0xf2 ,0xe1 ,0x3f ,0x2d ,0x29 ,0xba ,0x2b ,0x7f ,
102
+ 0xdf ,0x8c ,0x50 ,0x66 ,0xa1 ,0x44 ,0x03 ,0x42 ,0x00 ,0x04 ,0xb1 ,0xab ,0xe8 ,0xa2 ,0xa1 ,0xe6 ,
103
+ 0x62 ,0x5e ,0xae ,0x9e ,0x7e ,0x41 ,0xcf ,0x7e ,0x95 ,0x58 ,0x19 ,0x51 ,0x47 ,0xea ,0x0f ,0xe2 ,
104
+ 0xf8 ,0xc2 ,0x1b ,0x61 ,0xa5 ,0x30 ,0x05 ,0xc0 ,0x91 ,0xb6 ,0x07 ,0xc2 ,0x43 ,0x46 ,0xda ,0x75 ,
105
+ 0xc0 ,0x58 ,0xd8 ,0x08 ,0xa5 ,0xbb ,0xdb ,0xdc ,0x0e ,0xf2 ,0x05 ,0x62 ,0xfb ,0x28 ,0xbb ,0xa7 ,
106
+ 0xd2 ,0x9e ,0xef ,0x8f ,0xbf ,0xba ,0xcd ,0x51 ,0xa5 ,0xfd
107
+ };
108
+
77
109
const uint8_t meshcop_nmkp_resp_ignore [] = {
78
110
MESHCOP_TLV_COMM_SIGNATURE ,
79
111
MESHCOP_TLV_COMM_TOKEN ,
@@ -184,28 +216,58 @@ static int thread_joiner_application_csrattrs_response_cb(int8_t service_id, uin
184
216
}
185
217
tr_info ("Receiving csrattrs response sending simpleenroll" );
186
218
187
- // TODO add certificate template to this message with included Private/Public key pair
219
+ // TODO Create CSR and private key here... Now we use hardcoded stuff.
220
+ thread_extension_bootstrap_network_private_key_set (cur , private_key , sizeof (private_key ));
221
+
188
222
coap_service_request_send (service_id , COAP_REQUEST_OPTIONS_SECURE_BYPASS , source_address , source_port ,
189
- COAP_MSG_TYPE_CONFIRMABLE , COAP_MSG_CODE_REQUEST_POST , ".well-known/est/simpleenroll" , THREAD_CONTENT_FORMAT_PKCS10 , NULL , 0 , thread_joiner_application_simple_enroll_response_cb );
223
+ COAP_MSG_TYPE_CONFIRMABLE , COAP_MSG_CODE_REQUEST_POST , ".well-known/est/simpleenroll" , THREAD_CONTENT_FORMAT_PKCS10 ,
224
+ csr_request , sizeof (csr_request ), thread_joiner_application_simple_enroll_response_cb );
190
225
191
226
return 0 ;
192
227
}
193
228
194
229
static int thread_joiner_application_rat_response_cb (int8_t service_id , uint8_t source_address [static 16 ], uint16_t source_port , sn_coap_hdr_s * response_ptr )
195
230
{
196
- (void ) response_ptr ;
231
+ char * ca_cert_ptr ;
232
+ uint16_t ca_cert_len = 0 ;
197
233
198
234
protocol_interface_info_entry_t * cur = protocol_stack_interface_info_get_by_id (thread_extension_bootstrap_find_id_by_service (service_id ));
199
235
200
236
if (!cur || !cur -> thread_info ) {
201
237
return -1 ;
202
238
}
239
+
203
240
tr_info ("Receiving RAT response sending csrattrs request" );
204
- // TODO Parse CA certificate from RAT response
241
+
242
+ if (!response_ptr || !response_ptr -> payload_ptr ) {
243
+ tr_error ("No response payload" );
244
+ return -1 ;
245
+ }
246
+
247
+ // Parse CA certificate from RAT response
248
+ // Replace with CBOR library, when the time is right
249
+ ca_cert_ptr = strstr ((const char * )response_ptr -> payload_ptr , "domainCAcert" );
250
+ if (ca_cert_ptr ) {
251
+ ca_cert_ptr += 13 ; // Jump over "domainCAcert and some cbor format byte...
252
+ ca_cert_len = common_read_16_bit ((uint8_t * )ca_cert_ptr ); // read length
253
+ ca_cert_ptr += 2 ;
254
+ tr_debug ("CA cert len %d" , ca_cert_len );
255
+ /* Set domain certificate pointer and length */
256
+ if (thread_info (cur )-> extension_credentials_ptr -> domain_ca_certificate_ptr ) {
257
+ ns_dyn_mem_free (thread_info (cur )-> extension_credentials_ptr -> domain_ca_certificate_ptr );
258
+ }
259
+ thread_info (cur )-> extension_credentials_ptr -> domain_ca_certificate_ptr = ns_dyn_mem_alloc (ca_cert_len );
260
+ if (!thread_info (cur )-> extension_credentials_ptr -> domain_ca_certificate_ptr ) {
261
+ return -1 ;
262
+ }
263
+ memcpy (thread_info (cur )-> extension_credentials_ptr -> domain_ca_certificate_ptr , ca_cert_ptr , ca_cert_len );
264
+ thread_info (cur )-> extension_credentials_ptr -> domain_ca_certificate_len = ca_cert_len ;
265
+ } else {
266
+ tr_error ("Response parse failed" );
267
+ }
205
268
206
269
// TODO Verify nonce
207
270
208
- // TODO add certificate template to this message with included Private/Public key pair
209
271
coap_service_request_send (service_id , COAP_REQUEST_OPTIONS_SECURE_BYPASS , source_address , source_port ,
210
272
COAP_MSG_TYPE_CONFIRMABLE , COAP_MSG_CODE_REQUEST_GET , ".well-known/est/csrattrs" , COAP_CT_NONE , NULL , 0 , thread_joiner_application_csrattrs_response_cb );
211
273
@@ -422,13 +484,14 @@ int thread_extension_bootstrap_network_certificate_set(protocol_interface_info_e
422
484
423
485
/* Set domain certificate pointer and length */
424
486
if (domain_certificate_ptr ) {
425
- thread_info (cur )-> extension_credentials_ptr -> domain_certificate_ptr = ns_dyn_mem_alloc (domain_certificate_len );
487
+ thread_info (cur )-> extension_credentials_ptr -> domain_certificate_ptr = ns_dyn_mem_alloc (domain_certificate_len + thread_info ( cur ) -> extension_credentials_ptr -> domain_ca_certificate_len );
426
488
if (!thread_info (cur )-> extension_credentials_ptr -> domain_certificate_ptr ) {
427
489
ns_dyn_mem_free (thread_info (cur )-> extension_credentials_ptr );
428
490
return -1 ;
429
491
}
430
492
memcpy (thread_info (cur )-> extension_credentials_ptr -> domain_certificate_ptr , domain_certificate_ptr , domain_certificate_len );
431
- thread_info (cur )-> extension_credentials_ptr -> domain_certificate_len = domain_certificate_len ;
493
+ memcpy (thread_info (cur )-> extension_credentials_ptr -> domain_certificate_ptr + domain_certificate_len , thread_info (cur )-> extension_credentials_ptr -> domain_ca_certificate_ptr , thread_info (cur )-> extension_credentials_ptr -> domain_ca_certificate_len );
494
+ thread_info (cur )-> extension_credentials_ptr -> domain_certificate_len = domain_certificate_len + thread_info (cur )-> extension_credentials_ptr -> domain_ca_certificate_len ;
432
495
}
433
496
434
497
return 0 ;
0 commit comments