Skip to content

Commit e0f7dcf

Browse files
author
Tero Heinonen
authored
Updates to thread extension bootstrap (ARMmbed#1714)
More logic added to thread extension bootstrapping.
1 parent 726b08b commit e0f7dcf

File tree

1 file changed

+70
-7
lines changed

1 file changed

+70
-7
lines changed

source/6LoWPAN/Thread/thread_extension_bootstrap.c

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ typedef struct thread_extension_credentials {
5454
uint8_t domain_name[16]; // Thread CCM domain name
5555
uint8_t ccm_addr[16]; // CCM destination address
5656
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
5758
unsigned char *domain_certificate_ptr; // Pointer to Thread CCM domain certificate
5859
unsigned char *domain_pk_ptr; // Pointer to Thread domain certificate private key
5960
const unsigned char *device_pk_ptr; // Pointer to CCM device certificate private key
@@ -62,6 +63,7 @@ typedef struct thread_extension_credentials {
6263

6364
uint16_t device_certificate_len; // Device certificate length
6465
uint16_t domain_certificate_len; // Domain certificate length
66+
uint16_t domain_ca_certificate_len; // Domain CA certificate length
6567
uint16_t device_pk_len; // Device certificate private key length
6668
uint16_t domain_pk_len; // Domain certificate private key length
6769
uint16_t ccm_port; // CCM destination port
@@ -74,6 +76,36 @@ typedef struct thread_extension_credentials {
7476

7577
#ifdef HAVE_THREAD_V2
7678

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+
77109
const uint8_t meshcop_nmkp_resp_ignore[] = {
78110
MESHCOP_TLV_COMM_SIGNATURE,
79111
MESHCOP_TLV_COMM_TOKEN,
@@ -184,28 +216,58 @@ static int thread_joiner_application_csrattrs_response_cb(int8_t service_id, uin
184216
}
185217
tr_info("Receiving csrattrs response sending simpleenroll");
186218

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+
188222
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);
190225

191226
return 0;
192227
}
193228

194229
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)
195230
{
196-
(void) response_ptr;
231+
char *ca_cert_ptr;
232+
uint16_t ca_cert_len = 0;
197233

198234
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(thread_extension_bootstrap_find_id_by_service(service_id));
199235

200236
if (!cur || !cur->thread_info) {
201237
return -1;
202238
}
239+
203240
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+
}
205268

206269
// TODO Verify nonce
207270

208-
// TODO add certificate template to this message with included Private/Public key pair
209271
coap_service_request_send(service_id, COAP_REQUEST_OPTIONS_SECURE_BYPASS, source_address, source_port,
210272
COAP_MSG_TYPE_CONFIRMABLE, COAP_MSG_CODE_REQUEST_GET, ".well-known/est/csrattrs", COAP_CT_NONE, NULL, 0, thread_joiner_application_csrattrs_response_cb);
211273

@@ -422,13 +484,14 @@ int thread_extension_bootstrap_network_certificate_set(protocol_interface_info_e
422484

423485
/* Set domain certificate pointer and length */
424486
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);
426488
if (!thread_info(cur)->extension_credentials_ptr->domain_certificate_ptr) {
427489
ns_dyn_mem_free(thread_info(cur)->extension_credentials_ptr);
428490
return -1;
429491
}
430492
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;
432495
}
433496

434497
return 0;

0 commit comments

Comments
 (0)