Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of OmniWheels by
tls_lib.c
00001 /* 00002 * Copyright (c) 2013-2017, Arm Limited and affiliates. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 */ 00017 #include "nsconfig.h" 00018 #include "ns_types.h" 00019 #ifdef PANA 00020 #include "string.h" 00021 #include "Core/include/address.h" 00022 #include "Core/include/ns_buffer.h" 00023 #ifdef ECC 00024 #include "libX509_V3.h" 00025 #include "ecc.h" 00026 #endif 00027 #include "randLIB.h" 00028 #include "Core/include/socket.h" 00029 //#include "6LoWPAN/Bootstraps/network_lib.h" 00030 #include "shalib.h" 00031 #include "Security/TLS/tls_lib.h" 00032 #include "Security/TLS/tls_ccm_crypt.h" 00033 #include "Security/Common/sec_lib.h" 00034 #include "nsdynmemLIB.h" 00035 #include "net_nvm_api.h" 00036 #include "Security/PANA/pana.h" 00037 #include "Security/PANA/pana_internal_api.h" 00038 #include "ns_trace.h" 00039 #include "common_functions.h" 00040 #include "net_interface.h" 00041 00042 #define TRACE_GROUP "TLSl" 00043 00044 typedef struct tls_psk_key_ { 00045 uint16_t key_id; 00046 uint8_t psk_key[16]; 00047 ns_list_link_t link; 00048 } tls_psk_key_t; 00049 00050 static NS_LIST_DEFINE(tls_psk_list, tls_psk_key_t, link); 00051 00052 NS_LARGE tls_header_t tls_header; 00053 NS_LARGE tls_msg_t tls_msg; 00054 00055 #ifdef ECC 00056 00057 tls_ecc_heap_t *ecc_allocate_ram(void); 00058 static uint8_t tls_parse_certificate(uint8_t *ptr, uint16_t len, sec_suite_t *tls_suite); 00059 static uint8_t tls_parse_certificate_verify(uint8_t *ptr, uint16_t len, sec_suite_t *tls_suite); 00060 static uint8_t ecc_verify_calculate_hash(sec_suite_t *tls_suite); 00061 void tls_ecc_reverse_hash(uint8_t *ptr); 00062 uint8_t tls_write_signature_parameters(uint8_t *ptr, uint8_t *signature_parameter, uint8_t leadin_zeros); 00063 uint8_t tls_parse_certificate_request(uint8_t *ptr, uint16_t len); 00064 static uint8_t tls_parse_client_key_exchange(uint8_t *ptr, uint16_t len, sec_suite_t *tls_suite); 00065 static uint8_t tls_parse_server_key_exchange(uint8_t *ptr, uint16_t len, sec_suite_t *tls_suite); 00066 00067 #endif 00068 00069 static uint8_t *tls_set_client_key_excange(uint8_t *ptr, sec_suite_t *tls_suite); 00070 static uint8_t tls_parse_server_hello(uint8_t *ptr, sec_suite_t *tls_suite); 00071 static uint8_t tls_parse_client_hello(uint8_t *ptr, uint16_t len, sec_suite_t *tls_suite); 00072 static tls_psk_key_t *tls_get_key(uint16_t key_id); 00073 00074 tls_session_t *amr_tls_session_allocate(void) { 00075 tls_session_t *t_session = 0; 00076 t_session = ns_dyn_mem_alloc(sizeof(tls_session_t)); 00077 if (t_session) { 00078 memset(t_session, 0, sizeof(tls_session_t)); 00079 } 00080 return t_session; 00081 } 00082 00083 void arm_tls_session_clear(tls_session_t *t_session) 00084 { 00085 if (t_session->tls_heap) { 00086 tls_heap_free(t_session->tls_heap); 00087 t_session->tls_heap = NULL; 00088 } 00089 } 00090 00091 static tls_heap_t * tls_heap_structure_allocate(void) { 00092 tls_heap_t *heap_ptr = (tls_heap_t *) ns_dyn_mem_temporary_alloc(sizeof(tls_heap_t)); 00093 if (heap_ptr) { 00094 memset(heap_ptr, 0, sizeof(tls_heap_t)); 00095 } 00096 return heap_ptr; 00097 } 00098 00099 int8_t arm_tls_add_psk_key(const uint8_t *key_ptr, uint16_t key_id) 00100 { 00101 tls_psk_key_t *key_entry = tls_get_key(key_id); 00102 00103 if (key_ptr == NULL) { 00104 return -1; 00105 } 00106 00107 /* If key with given ID already exists, remove old */ 00108 if (key_entry) { 00109 arm_tls_remove_psk_key(key_id); 00110 key_entry = NULL; 00111 } 00112 00113 /* Make new entry */ 00114 key_entry = ns_dyn_mem_alloc(sizeof(tls_psk_key_t)); 00115 if (key_entry == NULL) { 00116 return -1; 00117 } 00118 00119 memcpy(key_entry->psk_key, key_ptr, 16); 00120 key_entry->key_id = key_id; 00121 00122 ns_list_add_to_end(&tls_psk_list, key_entry); 00123 00124 return 0; 00125 } 00126 00127 int8_t arm_tls_check_key(uint16_t key_id) 00128 { 00129 if (tls_get_key(key_id) == NULL) { 00130 return -1; 00131 } 00132 return 0; 00133 } 00134 00135 int8_t arm_tls_remove_psk_key(uint16_t key_id) 00136 { 00137 tls_psk_key_t *key_to_remove = tls_get_key(key_id); 00138 00139 if (key_to_remove == NULL) { 00140 return -1; 00141 } 00142 00143 ns_list_remove(&tls_psk_list, key_to_remove); 00144 00145 ns_dyn_mem_free(key_to_remove); 00146 00147 return 0; 00148 } 00149 00150 /* returns key entry, null if not found */ 00151 static tls_psk_key_t *tls_get_key(uint16_t key_id) 00152 { 00153 ns_list_foreach(tls_psk_key_t, entry, &tls_psk_list) { 00154 if (entry->key_id == key_id) { 00155 return entry; 00156 } 00157 } 00158 return NULL; 00159 } 00160 00161 00162 00163 void tls_finnish_copy(uint8_t *ptr, tls_heap_t *heap_ptr) 00164 { 00165 tls_msg_t *tmp_msg = tls_msg_ptr_get(); 00166 tmp_msg->len = 12; 00167 tmp_msg->msg_ptr = ptr; 00168 tls_handshake_copy(tmp_msg, heap_ptr); 00169 00170 } 00171 00172 uint8_t tls_parse_client_hello(uint8_t *ptr, uint16_t len, sec_suite_t *tls_suite) 00173 { 00174 uint8_t ret_val = 0, i = 0; 00175 uint16_t tls_version; 00176 tls_version = common_read_16_bit(ptr); 00177 ptr += 2; 00178 if (tls_version == TLS_1_2_VERSION) { 00179 uint8_t id_len; 00180 tls_heap_t *thep = tls_suite->tls_session->tls_heap; 00181 memcpy((thep->tls_hello_random + CLIENT_HELLO_PTR), ptr, 32); 00182 ptr += 32; 00183 //skip sesion id 00184 id_len = *ptr++; 00185 len -= 35; 00186 if (id_len < 33 && (len > id_len + 3)) { 00187 if (id_len == 0) { 00188 tr_debug("Fisrt Time generate ID!!"); 00189 len -= 2; 00190 tls_session_id_genrate(tls_suite->tls_session->tls_session_id, 4); 00191 tls_suite->tls_session->id_length = 4; 00192 } else { 00193 if (tls_suite->tls_session->id_length == id_len) { 00194 if (memcmp(tls_suite->tls_session->tls_session_id, ptr, id_len) == 0) { 00195 tr_debug("Generate new Session"); 00196 tls_session_id_genrate(tls_suite->tls_session->tls_session_id, 4); 00197 tls_suite->tls_session->id_length = 4; 00198 00199 } 00200 } 00201 00202 if (ret_val != 0) { 00203 tr_debug("TLS SESSION ID FAIL"); 00204 return 0; 00205 } 00206 ptr += id_len; 00207 len -= id_len; 00208 len -= 1; 00209 } 00210 ptr++; 00211 00212 id_len = *ptr++; 00213 ret_val = 0; 00214 00215 while (id_len) { 00216 if (len < 2) { 00217 tr_debug("Cor Client hello pack"); 00218 return 0; 00219 } 00220 uint16_t tls_ciphersuite = common_read_16_bit(ptr); 00221 switch (tls_ciphersuite) { 00222 case TLS_PSK_WITH_AES_128_CCM_8: 00223 tr_debug("Client Sup PSK"); 00224 ret_val |= SEC_CIPHERSUITE_PSK; 00225 break; 00226 #ifdef ECC 00227 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8: 00228 thep->client_knows_standard_ecc_ciphersuite = true; 00229 /* no break */ 00230 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_COMPAT: 00231 tr_debug("Client Sup ECC"); 00232 ret_val |= SEC_CIPHERSUITE_ECC; 00233 break; 00234 #endif 00235 default: 00236 tr_debug("Un Sup Suite: %04" PRIx16, tls_ciphersuite); 00237 break; 00238 } 00239 ptr += 2; 00240 id_len -= 2; 00241 len -= 2; 00242 00243 } 00244 ret_val &= tls_suite->supported_chipher_suites; 00245 if (ret_val) { 00246 tr_debug("Client pack TRUE"); 00247 00248 if (ret_val & SEC_CIPHERSUITE_ECC) { 00249 thep->tls_chipher_mode = CHIPHER_ECC; 00250 } else { 00251 thep->tls_chipher_mode = CHIPHER_PSK; 00252 } 00253 } else { 00254 tr_debug("CipherSuite Err"); 00255 i = 2; 00256 } 00257 } else { 00258 tr_debug("Session ID length Fail: %02x", *ptr); 00259 i = 4; 00260 } 00261 } else { 00262 i = 3; 00263 } 00264 if (i) { 00265 tr_debug("%02x", i); 00266 } 00267 return ret_val; 00268 } 00269 00270 00271 uint8_t tls_parse_server_hello(uint8_t *ptr, sec_suite_t *tls_suite) 00272 { 00273 uint8_t ret_val = 0, i = 0; 00274 uint16_t tls_version; 00275 tls_version = common_read_16_bit(ptr); 00276 ptr += 2; 00277 if (tls_version == TLS_1_2_VERSION) { 00278 uint8_t id_len; 00279 tls_heap_t *thep = tls_suite->tls_session->tls_heap; 00280 if (thep == 0) { 00281 return 0; 00282 } 00283 memcpy((thep->tls_hello_random + SERVER_HELLO_PTR), ptr, 32); 00284 ptr += 32; 00285 //skip sesion id 00286 id_len = *ptr++; 00287 if (id_len < 33) { 00288 tls_suite->tls_session->id_length = id_len; 00289 memcpy(tls_suite->tls_session->tls_session_id, ptr, id_len); 00290 ptr += id_len; 00291 uint16_t tls_cipher_suite = common_read_16_bit(ptr); 00292 switch (tls_cipher_suite) { 00293 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8: 00294 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_COMPAT: 00295 tr_debug("ECC CipherSuite"); 00296 ret_val = 2; 00297 thep->tls_chipher_mode = CHIPHER_ECC; 00298 break; 00299 case TLS_PSK_WITH_AES_128_CCM_8: 00300 tr_debug("PSK CipherSuite"); 00301 ret_val = 1; 00302 thep->tls_chipher_mode = CHIPHER_PSK; 00303 tls_ecc_heap_free(thep); 00304 break; 00305 default: 00306 tr_debug("CipherSuite Err: %04x", tls_cipher_suite); 00307 ptr += 2; 00308 i = 2; 00309 break; 00310 } 00311 } else { 00312 tr_debug("Session ID length Fail: %02x", *ptr); 00313 i = 4; 00314 } 00315 } else { 00316 i = 3; 00317 } 00318 if (i) { 00319 tr_debug("%02x", i); 00320 } 00321 return ret_val; 00322 } 00323 00324 00325 void tls_alert_build(buffer_t *buf, uint8_t alert) 00326 { 00327 tr_debug("TTLs TX:Alert"); 00328 //Build Client Hello 00329 buffer_data_clear(buf); 00330 buffer_push_uint8(buf, TLS_ALERT_TYPE); 00331 buffer_push_uint16(buf, TLS_1_2_VERSION); 00332 buffer_push_uint16(buf, 0x0002); //Length 00333 00334 if (alert == ALERT_CLOSE) { 00335 buffer_push_uint8(buf, 1); //Mean 2=Fatal, 1=warming 00336 } else { 00337 buffer_push_uint8(buf, 2); //Mean 2=Fatal, 1=warming 00338 } 00339 buffer_push_uint8(buf, alert); 00340 } 00341 00342 #ifdef PANA_SERVER_API 00343 void tls_server_hello_build(buffer_t *buf, sec_suite_t *tls_suite) 00344 { 00345 uint16_t tls_len = 0; 00346 uint8_t *ptr; 00347 tls_msg_t *tmp_msg = tls_msg_ptr_get(); 00348 tr_debug("TTLs TX:Server Hello"); 00349 //Build Client Hello 00350 buffer_data_clear(buf); 00351 ptr = buffer_data_pointer(buf); 00352 *ptr++ = TLS_HANDSHAKE; 00353 ptr = common_write_16_bit(TLS_1_2_VERSION, ptr); 00354 ptr = common_write_16_bit(tls_len, ptr); 00355 00356 //for Hash calculation 00357 tmp_msg->msg_ptr = ptr + 4; 00358 ptr = tls_build_server_hello_msg(ptr, tls_suite->tls_session); 00359 buffer_data_end_set(buf, ptr); 00360 00361 tls_len = buffer_data_length(buf); 00362 tls_len -= 9; 00363 tmp_msg->len = tls_len; 00364 tls_handshake_copy(tmp_msg, tls_suite->tls_session->tls_heap); 00365 00366 tls_len += 4; 00367 ptr = buffer_data_pointer(buf); 00368 ptr += 3; 00369 ptr = common_write_16_bit(tls_len, ptr); 00370 } 00371 #endif 00372 00373 void tls_prepare_change_chipher_spec(sec_suite_t *tls_suite) 00374 { 00375 tls_heap_t *theap = tls_suite->tls_session->tls_heap; 00376 bool server; 00377 tls_build_client_verify_payload(theap); 00378 if ((tls_suite->setups & TLS_SERVER_MODE) == 0) { 00379 server = false; 00380 if ((tls_suite->setups & TLS_HANSHAKE_HASH) == 0) { 00381 tls_finnish_copy(theap->hash_buf + 4, theap); 00382 tls_suite->setups |= TLS_HANSHAKE_HASH; 00383 } 00384 00385 } else { 00386 server = true; 00387 } 00388 00389 tls_ccm_data_encrypt(theap->hash_buf, 16,tls_suite->tls_session->key_expansion, tls_suite->tls_session->tls_nonce_explit, TLS_HANDSHAKE, server); 00390 } 00391 00392 00393 static buffer_t *tls_down(buffer_t *buf) 00394 { 00395 uint16_t tls_len; 00396 if ((buf = buffer_headroom(buf, 5)) != 0) { 00397 uint8_t *ptr; 00398 buffer_data_reserve_header(buf, 5); 00399 ptr = buffer_data_pointer(buf); 00400 tls_len = buffer_data_length(buf); 00401 tls_len -= 5; //Cut Flags byte off 00402 00403 *ptr++ = TLS_HANDSHAKE; 00404 ptr = common_write_16_bit(TLS_1_2_VERSION, ptr); 00405 ptr = common_write_16_bit(tls_len, ptr); 00406 } 00407 return (buf); 00408 } 00409 00410 #ifdef ECC 00411 00412 void tls_parse_subject_get_pub_key_from_chain(tls_heap_t *theap, uint8_t rd_ptr) 00413 { 00414 uint8_t *ptr = 0; 00415 certificate_info_t *cer_info = &(theap->rx_ceri_chain.certi_chain[rd_ptr]); 00416 uint8_t i; 00417 ptr = cer_info->pub_key_ptr; 00418 theap->ecc_heap->cert_pub_key.finite = 1; 00419 theap->ecc_heap->cert_pub_key.invalid = 0; 00420 00421 memset(theap->ecc_heap->cert_pub_key.x.data, 0, sizeof(MPint)); 00422 memset(theap->ecc_heap->cert_pub_key.y.data, 0, sizeof(MPint)); 00423 tr_debug("Certificates PUB Key: %s", tr_array(ptr, 64)); 00424 for (i = 0; i < 32; i++) { 00425 00426 *((uint8_t *)theap->ecc_heap->cert_pub_key.x.data + i) = *(ptr + 31 - i) ; 00427 *((uint8_t *)theap->ecc_heap->cert_pub_key.y.data + i) = *(ptr + 63 - i) ; 00428 00429 } 00430 } 00431 00432 00433 00434 uint8_t tls_parse_certificate(uint8_t *ptr, uint16_t len, sec_suite_t *tls_suite) 00435 { 00436 00437 uint16_t sub_len = 0; 00438 uint8_t ret_val = 0; 00439 tls_heap_t *theap = tls_suite->tls_session->tls_heap; 00440 //Check Lengths 00441 if (*ptr++) { 00442 tr_debug("Too Long len"); 00443 } else { 00444 sub_len = common_read_16_bit(ptr); 00445 ptr += 2; 00446 len -= 3; 00447 tr_debug("Certi(Chain) Len: %04x", sub_len); 00448 if (sub_len == 0 || sub_len > len) { 00449 tr_debug("Cert Base len mis match"); 00450 } else { 00451 if (x509_v3_certi_chain_analyze(ptr, sub_len, &(theap->rx_ceri_chain)) == 0) { 00452 tr_debug("Certificate Chain not valid"); 00453 } else { 00454 tls_parse_subject_get_pub_key_from_chain(theap, 0); 00455 ret_val = 1; 00456 } 00457 } 00458 } 00459 return ret_val; 00460 00461 } 00462 00463 00464 uint8_t tls_parse_server_key_exchange(uint8_t *ptr, uint16_t len, sec_suite_t *tls_suite) 00465 { 00466 (void)len; 00467 uint16_t curve_type; 00468 if (*ptr++ == 3) { 00469 curve_type = common_read_16_bit(ptr); 00470 if (curve_type == TLS_NAMED_CURVE_SECP256R1) { 00471 uint8_t c_len = 0, mode; 00472 uint16_t sig_algh, signature_len; 00473 tls_heap_t *theap = tls_suite->tls_session->tls_heap; 00474 ptr += 2; 00475 //len -= 5; 00476 c_len = *ptr++; 00477 mode = *ptr++; 00478 00479 if (mode == 4) { 00480 c_len--; 00481 memcpy(theap->ecc_heap->server_public_key, ptr, 64); 00482 ptr += 64; 00483 sig_algh = common_read_16_bit(ptr); 00484 if (sig_algh != TLS_SIG_HASH_ALG_SHA256_ECDSA) { 00485 tr_debug("tls ser key ex. er"); 00486 return 0; 00487 } 00488 ptr += 2; 00489 signature_len = common_read_16_bit(ptr); 00490 if (signature_len < 11) { 00491 return 0; 00492 } 00493 ptr += 2; 00494 if (*ptr++ != 0x30) { 00495 return 0; 00496 } 00497 if (*ptr++ < 9) { 00498 return 0; 00499 } 00500 if (*ptr++ != 2) { 00501 return 0; 00502 } else { 00503 uint8_t rslen; 00504 //uint8_t i; 00505 theap->key_signature_ptr = ptr; 00506 rslen = *ptr++; 00507 00508 if (rslen > 33) { 00509 return 0; 00510 } else if (rslen == 0) { 00511 return 0; 00512 } else if (rslen == 33) { 00513 00514 ptr++; 00515 rslen = 32; 00516 00517 } 00518 if (theap->ecc_heap->sgnt == 0) { 00519 theap->ecc_heap->sgnt = ECDSA_get_signature(); 00520 } 00521 if (!theap->ecc_heap->sgnt) { 00522 return 0; 00523 } 00524 00525 ptr += rslen; 00526 if (*ptr++ != 2) { 00527 return 0; 00528 } 00529 00530 rslen = *ptr++; 00531 00532 if (rslen > 33) { 00533 return 0; 00534 } else if (rslen == 0) { 00535 return 0; 00536 } 00537 return 1; 00538 } 00539 00540 } else { 00541 tr_debug("Mode!: %02x", mode); 00542 } 00543 } 00544 } 00545 return 0; 00546 } 00547 00548 static uint8_t tls_parse_client_key_exchange(uint8_t *ptr, uint16_t len, sec_suite_t *tls_suite) 00549 { 00550 (void)len; 00551 uint8_t d_len = 0; 00552 uint8_t mode = 0; 00553 d_len = *ptr++; 00554 mode = *ptr++; 00555 if (d_len == 65 && mode == 4) { 00556 tls_heap_t *theap = tls_suite->tls_session->tls_heap; 00557 tr_debug("Valid Client ECC curve:"); 00558 memcpy(theap->ecc_heap->client_public_key, ptr, 64); 00559 tr_debug("%s", tr_array(ptr, 64)); 00560 return 1; 00561 } else { 00562 tr_debug("Len: %02x, mode fail: %02x", d_len, mode); 00563 } 00564 00565 return 0; 00566 } 00567 00568 00569 void tls_read_certi_signature(tls_heap_t *theap, uint8_t certificate) 00570 { 00571 uint8_t rslen = 0; 00572 uint8_t *ptr = 0; 00573 if (certificate) { 00574 // 00575 certificate_info_t *cer_info = &(theap->rx_ceri_chain.certi_chain[theap->rx_ceri_chain.rd_ptr]); 00576 ptr = cer_info->signature_ptr; 00577 } else { 00578 ptr = theap->key_signature_ptr; 00579 } 00580 memset(theap->ecc_heap->sgnt->m_R.data, 0, sizeof(MPint)); 00581 memset(theap->ecc_heap->sgnt->m_s.data, 0, sizeof(MPint)); 00582 rslen = x509_v3_parse_signature_parameter(ptr, ((uint8_t *)theap->ecc_heap->sgnt->m_R.data)); 00583 ptr += rslen; 00584 ptr++; 00585 x509_v3_parse_signature_parameter(ptr, ((uint8_t *)theap->ecc_heap->sgnt->m_s.data)); 00586 00587 } 00588 00589 00590 uint8_t tls_parse_certificate_verify(uint8_t *ptr, uint16_t len, sec_suite_t *tls_suite) 00591 { 00592 (void)len; 00593 uint16_t sig_algh, sig_len; 00594 tls_heap_t *theap = tls_suite->tls_session->tls_heap; 00595 00596 sig_algh = common_read_16_bit(ptr); 00597 if (sig_algh != TLS_SIG_HASH_ALG_SHA256_ECDSA) { 00598 tr_debug("tls ser key ex. er2"); 00599 return 0; 00600 } 00601 ptr += 2; 00602 sig_len = common_read_16_bit(ptr); 00603 if (sig_len < 11) { 00604 return 0; 00605 } 00606 ptr += 2; 00607 if (*ptr++ != 0x30) { 00608 return 0; 00609 } 00610 if (*ptr++ < 9) { 00611 return 0; 00612 } 00613 if (theap->ecc_heap) { 00614 if (theap->ecc_heap->sgnt == 0) { 00615 tr_debug("Allocate SIG"); 00616 theap->ecc_heap->sgnt = ECDSA_get_signature(); 00617 00618 if (!theap->ecc_heap->sgnt) { 00619 tr_debug("Signature Allocate Fail"); 00620 return 0; 00621 } 00622 } 00623 } else { 00624 return 0; 00625 } 00626 memset(theap->ecc_heap->sgnt->m_R.data, 0, sizeof(MPint)); 00627 memset(theap->ecc_heap->sgnt->m_s.data, 0, sizeof(MPint)); 00628 00629 00630 if (*ptr++ != 2) { 00631 return 0; 00632 } else { 00633 uint8_t rslen = 0; 00634 theap->key_signature_ptr = ptr; 00635 rslen = x509_v3_parse_signature_parameter(ptr, ((uint8_t *)theap->ecc_heap->sgnt->m_R.data)); 00636 if (rslen == 0) { 00637 return 0; 00638 } 00639 ptr += rslen; 00640 } 00641 if (*ptr++ != 2) { 00642 return 0; 00643 } else { 00644 uint8_t rslen = 0; 00645 rslen = x509_v3_parse_signature_parameter(ptr, ((uint8_t *)theap->ecc_heap->sgnt->m_s.data)); 00646 if (rslen == 0) { 00647 return 0; 00648 } 00649 //ptr += rslen; 00650 } 00651 return 1; 00652 } 00653 00654 00655 tls_ecc_heap_t *ecc_allocate_ram(void) 00656 { 00657 tls_ecc_heap_t *heap_ptr = (tls_ecc_heap_t *) ns_dyn_mem_temporary_alloc(sizeof(tls_ecc_heap_t)); 00658 00659 if (heap_ptr == 0) { 00660 tr_debug("ECC variable malloc fail"); 00661 } else { 00662 //heap_scan(); 00663 heap_ptr->sgnt = ecc_get_ecdsa_signature(); 00664 if (!heap_ptr->sgnt) { 00665 tr_debug("Signature Fail"); 00666 ns_dyn_mem_free(heap_ptr); 00667 heap_ptr = 0; 00668 } 00669 } 00670 return heap_ptr; 00671 00672 } 00673 00674 00675 uint8_t *tls_client_key_exchange_msg_set(uint8_t *ptr , tls_heap_t *heap_ptr) 00676 { 00677 /* Client Key Exchange */ 00678 *ptr++ = TLS_CLIENT_KEY_EXCHANGE; 00679 ptr = common_write_24_bit(66, ptr); 00680 ptr = common_write_16_bit(0x4104, ptr); 00681 //There shuold be calculated case now only test purpose 00682 memcpy(ptr, heap_ptr->ecc_heap->client_public_key, 64); 00683 ptr += 64; 00684 return ptr; 00685 } 00686 #endif 00687 00688 00689 uint8_t *tls_set_client_key_excange(uint8_t *ptr, sec_suite_t *tls_suite) 00690 { 00691 uint8_t key_id_len = (tls_suite->psk_key_id > 0xFF) ? 2 : 1; 00692 00693 /* TLS plaintext header = [type][version][length] */ 00694 *ptr++ = TLS_HANDSHAKE; 00695 ptr = common_write_16_bit(TLS_1_2_VERSION, ptr); 00696 ptr = common_write_16_bit(6 + key_id_len, ptr); 00697 00698 /* Handshake message [msg_type][length] */ 00699 *ptr++ = TLS_CLIENT_KEY_EXCHANGE; 00700 ptr = common_write_24_bit(2 + key_id_len, ptr); 00701 00702 /* ClientKeyExchange [length][psk_id] */ 00703 ptr = common_write_16_bit(key_id_len, ptr); //len 00704 if (tls_suite->psk_key_id > 0xFF) { 00705 *ptr++ = tls_suite->psk_key_id >> 8; 00706 } 00707 *ptr++ = tls_suite->psk_key_id; 00708 00709 return ptr; 00710 } 00711 00712 uint8_t *tls_build_change_chipher_suite_finnish_msg(uint8_t *ptr, tls_session_t *tls_session) 00713 { 00714 *ptr++ = TLS_CHANGE_CIPHER_SPEC; 00715 ptr = common_write_16_bit(TLS_1_2_VERSION, ptr); 00716 ptr = common_write_16_bit(1, ptr); //len 00717 *ptr++ = 1; 00718 *ptr++ = TLS_HANDSHAKE; 00719 ptr = common_write_16_bit(TLS_1_2_VERSION, ptr); 00720 ptr = common_write_16_bit(32, ptr); //len 00721 //Calculate Verify and MAC (MIC) 00722 //CCMNONCEEXPLICT //SHuold be 0x0000000000000000 at client side 00723 00724 memcpy(ptr, tls_session->tls_nonce_explit, 8); // Dynamic 00725 ptr += 8; 00726 //MSG Finished 00727 memcpy(ptr, tls_session->tls_heap->hash_buf, 24); 00728 ptr += 24; 00729 return ptr; 00730 } 00731 00732 void tls_build_client_change_chipher_suite_finnish(buffer_t *buf, sec_suite_t *tls_suite) 00733 { 00734 uint8_t *ptr; 00735 buffer_data_clear(buf); 00736 ptr = buffer_data_pointer(buf); 00737 if ((tls_suite->setups & TLS_SERVER_MODE) == 0) { 00738 ptr = tls_set_client_key_excange(ptr, tls_suite); 00739 } 00740 ptr = tls_build_change_chipher_suite_finnish_msg(ptr, tls_suite->tls_session); 00741 buffer_data_end_set(buf, ptr); 00742 tr_debug("TLS TX: KEY Exchange"); 00743 } 00744 #ifdef ECC 00745 void tls_ecc_verfify_start(sec_suite_t *tls_suite) 00746 { 00747 if (ecc_state_idle_check() == ECC_STATUS_OK) { 00748 tls_heap_t *tls_heap = tls_suite->tls_session->tls_heap; 00749 uint8_t hash_response = ecc_verify_calculate_hash(tls_suite); 00750 if (hash_response) { 00751 tr_debug("HASH calc Fail: %02x", hash_response); 00752 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_INTERNAL); 00753 } else { 00754 int8_t ecc_response = ecc_calculate_verify(tls_heap->ecc_heap->sgnt, &(tls_heap->ecc_heap->cert_pub_key), &ecc_operation_done_callback); 00755 if (ecc_response == ECC_STATUS_OK) { 00756 tls_heap->ecc_heap->sgnt = 0; 00757 sec_lib_state_machine_lock(tls_suite, TLS_ECC_MESSAGE_VERIFY); 00758 sec_ecc_state_save(tls_suite); 00759 } else { 00760 tr_debug("calcVerify Fail: %d", ecc_response); 00761 } 00762 } 00763 } else { 00764 sec_lib_state_machine_trig(tls_suite, TLS_ECC_MESSAGE_VERIFY_START2); 00765 } 00766 } 00767 00768 00769 void tls_certificate_signature_verify(sec_suite_t *tls_suite) 00770 { 00771 tls_heap_t *tls_heap = tls_suite->tls_session->tls_heap; 00772 if (ecc_state_idle_check() == ECC_STATUS_OK) { 00773 uint8_t alert_tx = 0; 00774 uint8_t chain_analyze_ok = 0; 00775 if (tls_heap->rx_ceri_chain.rd_ptr + 1 <= tls_heap->rx_ceri_chain.wr_ptr) { 00776 uint8_t certi_verify = 0; 00777 certificate_info_t *cer_info = &(tls_heap->rx_ceri_chain.certi_chain[tls_heap->rx_ceri_chain.rd_ptr]); 00778 00779 //Verify Cur Certi Signature bye Next Certi PK 00780 tr_debug("index,Check Signature: rd: %02x, wr: %02x", tls_heap->rx_ceri_chain.rd_ptr, tls_heap->rx_ceri_chain.wr_ptr); 00781 00782 if ((tls_heap->rx_ceri_chain.rd_ptr + 1) == tls_heap->rx_ceri_chain.wr_ptr) { 00783 uint8_t self_signed = 0; 00784 if (cer_info->issue_len == cer_info->subj_len) { 00785 if (memcmp(cer_info->issue_ptr, cer_info->subj_ptr, cer_info->issue_len) == 0) { 00786 self_signed = 1; 00787 } 00788 } 00789 00790 if (self_signed) { 00791 certificate_chain_internal_t *temp; 00792 00793 temp = sec_cetificate_chain_get(SEC_NWK_AUTHENTICATION_CERTI_CHAIN); 00794 00795 tr_debug("SELF Signed. Compare Root"); 00796 if (temp) { 00797 uint16_t root_len = 0; 00798 uint8_t root_type = 0; 00799 const uint8_t *ptr = temp->certi_chain[0]; 00800 uint8_t *root_ptr = cer_info->certi_ptr; 00801 root_ptr -= 4; 00802 asn1_parse(root_ptr, &root_len, &root_type); 00803 alert_tx = 1; 00804 if ((root_len + 4) == temp->certi_len[0]) { 00805 if (memcmp(root_ptr, ptr, temp->certi_len[0]) == 0) { 00806 tr_debug("Trusted Root certificate"); 00807 alert_tx = 0; 00808 chain_analyze_ok = 1; 00809 } else { 00810 tr_debug("Not Trusted Root"); 00811 } 00812 } else { 00813 alert_tx = 1; 00814 } 00815 } else { 00816 alert_tx = 1; 00817 } 00818 } else { 00819 00820 //Compare all ways to Root Certi 00821 certificate_chain_internal_t *temp; 00822 00823 temp = sec_cetificate_chain_get(SEC_NWK_AUTHENTICATION_CERTI_CHAIN); 00824 if (temp) { 00825 if (temp->sub_len[0] == cer_info->issue_len) { 00826 if (memcmp(cer_info->issue_ptr, temp->sub_chain[0], cer_info->issue_len) == 0) { 00827 tr_debug("Get Root PK"); 00828 tls_heap->rx_ceri_chain.wr_ptr--; 00829 if (x509_v3_certi_pk_get((uint8_t *)temp->certi_chain[0], &(tls_heap->rx_ceri_chain)) == 0) { 00830 tr_debug("..fail"); 00831 } else { 00832 tr_debug("..OK"); 00833 tls_parse_subject_get_pub_key_from_chain(tls_heap, (tls_heap->rx_ceri_chain.rd_ptr)); 00834 certi_verify = 2; 00835 } 00836 } 00837 } 00838 if (certi_verify == 0) { 00839 alert_tx = 1; 00840 tr_debug("Unknow CA"); 00841 } 00842 } else { 00843 alert_tx = 1; 00844 } 00845 } 00846 } else { 00847 00848 certificate_info_t *cer_sig = &(tls_heap->rx_ceri_chain.certi_chain[tls_heap->rx_ceri_chain.rd_ptr + 1]); 00849 00850 if (cer_info->issue_len == cer_sig->subj_len) { 00851 if (memcmp(cer_info->issue_ptr, cer_sig->subj_ptr, cer_info->issue_len) == 0) { 00852 certi_verify = 1; 00853 } else { 00854 alert_tx = 1; 00855 tr_debug("Not Valid chain signature subject entry"); 00856 } 00857 } else { 00858 alert_tx = 1; 00859 tr_debug("Not Valid chain signature subject len"); 00860 } 00861 00862 00863 } 00864 if (certi_verify) { 00865 //Calc HASH 00866 memset((uint8_t *)tls_heap->ecc_heap->sgnt->m_m.data, 0, sizeof(MPint)); 00867 ns_sha256(cer_info->certi_ptr, cer_info->certi_len, tls_heap->ecc_heap->sgnt->m_m.data); 00868 tls_ecc_reverse_hash((uint8_t *)tls_heap->ecc_heap->sgnt->m_m.data); 00869 00870 //GET Signature From Cur Certi 00871 tls_read_certi_signature(tls_heap, 1); 00872 00873 //GET PUB KEY from next HOP 00874 if (certi_verify == 1) { 00875 tls_parse_subject_get_pub_key_from_chain(tls_heap, (tls_heap->rx_ceri_chain.rd_ptr + 1)); 00876 00877 } 00878 00879 if (ecc_calculate_verify(tls_heap->ecc_heap->sgnt, &tls_heap->ecc_heap->cert_pub_key, &ecc_operation_done_callback) == ECC_STATUS_OK) { 00880 tls_heap->ecc_heap->sgnt = 0; 00881 sec_lib_state_machine_lock(tls_suite, TLS_ECC_CERTIFICATE_SIGNATURE_CHECK); 00882 sec_ecc_state_save(tls_suite); 00883 tls_heap->rx_ceri_chain.rd_ptr++; 00884 } else { 00885 if (tls_heap->ecc_heap->sgnt) { 00886 ns_dyn_mem_free(tls_heap->ecc_heap->sgnt); 00887 tls_heap->ecc_heap->sgnt = 0; 00888 } 00889 alert_tx = 1; 00890 00891 } 00892 } 00893 } else { 00894 chain_analyze_ok = 1; 00895 } 00896 00897 if (chain_analyze_ok) { 00898 if (tls_heap->signature_temp_buf) { 00899 //Take Signature 00900 tls_read_certi_signature(tls_heap, 0); 00901 if (tls_heap->signature_temp_buf == tls_heap->cert_temp_buf) { 00902 tls_heap->signature_temp_buf = 0; 00903 } else { 00904 if (tls_heap->pointer_types & 2) { 00905 buffer_free(tls_heap->signature_temp_buf); 00906 } else { 00907 ns_dyn_mem_free(tls_heap->signature_temp_buf); 00908 } 00909 tls_heap->signature_temp_buf = 0; 00910 } 00911 } 00912 00913 tr_debug("Certi signature check OK"); 00914 tls_parse_subject_get_pub_key_from_chain(tls_heap, 0); 00915 00916 if (tls_heap->rx_ceri_chain.wr_ptr == 0) { 00917 certificate_info_t *c_ptr = &(tls_heap->rx_ceri_chain.certi_chain[0]); 00918 if (x509_v3_certi_pk_get((uint8_t *)c_ptr->certi_ptr, &tls_heap->rx_ceri_chain) == 0) { 00919 tr_debug("Fail read certificate PUB Key"); 00920 } else { 00921 tls_parse_subject_get_pub_key_from_chain(tls_heap, (tls_heap->rx_ceri_chain.wr_ptr)); 00922 } 00923 } 00924 00925 if (tls_heap->pointer_types & 1) { 00926 buffer_free(tls_heap->cert_temp_buf); 00927 } else { 00928 ns_dyn_mem_free(tls_heap->cert_temp_buf); 00929 } 00930 tls_heap->cert_temp_buf = 0; 00931 00932 if (tls_suite->setups & TLS_SERVER_MODE) { 00933 sec_lib_state_machine_trig(tls_suite, TLS_ECC_MESSAGE_SERVER_VERIFY_START); 00934 } else { 00935 tr_debug("Start Do Certi Verify calc"); 00936 sec_lib_state_machine_trig(tls_suite, TLS_ECC_MESSAGE_VERIFY_START2); 00937 } 00938 } 00939 if (alert_tx) { 00940 tr_debug("PSK cal fail"); 00941 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_INTERNAL); 00942 } 00943 } else { 00944 tls_suite->timer = 1; 00945 } 00946 } 00947 00948 void tls_server_finnish_handle_start(sec_suite_t *tls_suite) 00949 { 00950 if (ecc_state_idle_check() == ECC_STATUS_OK) { 00951 tls_heap_t *tls_heap = tls_suite->tls_session->tls_heap; 00952 uint8_t alert_tx = 0; 00953 if (tls_suite->setups & TLS_ECC_CERTIFICATE_VERIFY) { 00954 memcpy(tls_heap->ecc_heap->sgnt->m_m.data, tls_heap->hash_buf, 32); 00955 // initialize the rest of MPint as the hash is covering only part of it 00956 memset(((uint8_t*)tls_heap->ecc_heap->sgnt->m_m.data) + 32, 0, sizeof(MPint) - 32); 00957 tls_ecc_reverse_hash((uint8_t *)tls_heap->ecc_heap->sgnt->m_m.data); 00958 00959 if (ecc_calculate_verify(tls_heap->ecc_heap->sgnt, &tls_heap->ecc_heap->cert_pub_key, &ecc_operation_done_callback) == ECC_STATUS_OK) { 00960 tls_heap->ecc_heap->sgnt = 0; 00961 sec_lib_state_machine_lock(tls_suite, TLS_ECC_MESSAGE_VERIFY); 00962 sec_ecc_state_save(tls_suite); 00963 } else { 00964 if (tls_heap->ecc_heap->sgnt) { 00965 ecc_library_free_pointer(tls_heap->ecc_heap->sgnt); 00966 //ns_dyn_mem_free(tls_heap->ecc_heap->sgnt); 00967 tls_heap->ecc_heap->sgnt = 0; 00968 } 00969 alert_tx = 1; 00970 00971 } 00972 } else { 00973 if (tls_ecc_start_premaster_secret(0, tls_suite) == 0) { 00974 alert_tx = 1; 00975 } 00976 } 00977 if (alert_tx) { 00978 tr_debug("PSK cal fail"); 00979 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_INTERNAL); 00980 } 00981 } else { 00982 sec_lib_state_machine_trig(tls_suite, TLS_ECC_MESSAGE_SERVER_VERIFY_START); 00983 } 00984 } 00985 #endif 00986 00987 #ifdef PANA_SERVER_API 00988 static buffer_t * tls_verify_handler(uint8_t certi_rx, tls_header_t *tls_header_ptr, buffer_t *buf, sec_suite_t *tls_suite) 00989 { 00990 tls_heap_t *tls_heap = tls_suite->tls_session->tls_heap; 00991 tls_heap->client_verify_buf_len = tls_header_ptr->length; 00992 if (tls_heap->client_verify_buf) { 00993 tr_debug("Free Server Client 1r"); 00994 ns_dyn_mem_free(tls_heap->client_verify_buf); 00995 tls_heap->client_verify_buf = 0; 00996 } 00997 tls_heap->client_verify_buf = ns_dyn_mem_alloc(tls_header_ptr->length); 00998 if (tls_heap->client_verify_buf) { 00999 memcpy(tls_heap->client_verify_buf, tls_header_ptr->ptr, tls_header_ptr->length); 01000 01001 #ifdef ECC 01002 if (tls_heap->tls_chipher_mode == CHIPHER_ECC) { 01003 01004 if (certi_rx) { 01005 sec_lib_state_machine_trig(tls_suite, TLS_ECC_MESSAGE_SERVER_VERIFY_START); 01006 tr_debug("Certi RX > 0"); 01007 if (tls_suite->tls_session->tls_heap) { 01008 uint8_t free_buf = 1; 01009 if (certi_rx & 1) { 01010 if (tls_heap->cert_temp_buf == 0) { 01011 tls_heap->pointer_types |= 1; 01012 tls_heap->cert_temp_buf = buf; 01013 free_buf = 0; 01014 } 01015 } 01016 if (certi_rx & 2) { 01017 if (tls_heap->signature_temp_buf == 0) { 01018 tls_heap->pointer_types |= 2; 01019 tls_heap->signature_temp_buf = buf; 01020 free_buf = 0; 01021 } 01022 } 01023 01024 if (free_buf == 0) { 01025 buf = NULL; 01026 } 01027 } 01028 01029 } 01030 if (buf) { 01031 buf = buffer_free(buf); 01032 } 01033 01034 } else 01035 #endif 01036 { 01037 tr_debug("Start Server PRF_CALC state"); 01038 sec_prf_state_set(tls_suite); 01039 } 01040 } else { 01041 tr_debug("Heap_error: client verify chiphersuite!!"); 01042 } 01043 01044 return (buf); 01045 } 01046 #endif 01047 01048 static int8_t tls_client_verify_handler(tls_header_t *tls_header_ptr, sec_suite_t *tls_suite) 01049 { 01050 if (tls_ccm_data_decrypt(tls_header_ptr->ptr, tls_header_ptr->length, tls_suite->tls_session->key_expansion, TLS_HANDSHAKE, true) == 0) { 01051 uint8_t *ptr = tls_header_ptr->ptr + 8; 01052 tls_heap_t *tls_heap = tls_suite->tls_session->tls_heap; 01053 01054 if (ptr[0] == TLS_FINISHED && common_read_24_bit(ptr + 1) == 12) { 01055 ptr += 4; 01056 // 01057 tr_debug("Finish RX: %s", tr_array(ptr, 12)); 01058 01059 memcpy(tls_heap->verify, ptr, 12); 01060 return 0; 01061 } else { 01062 //RETURN error 01063 tr_debug("No Chiphertext"); 01064 return -1; 01065 } 01066 } 01067 01068 tr_debug("Encode error"); 01069 return -2; 01070 01071 } 01072 01073 static buffer_t * tls_certificate_buffer_store(buffer_t *buf, uint8_t certi_rx, sec_suite_t *tls_suite) 01074 { 01075 if (certi_rx) { 01076 if (tls_suite->tls_session->tls_heap) { 01077 uint8_t free_buf = 1; 01078 tls_heap_t *theap = tls_suite->tls_session->tls_heap; 01079 if (certi_rx & 1) { 01080 if (theap->cert_temp_buf == 0) { 01081 theap->pointer_types |= 1; 01082 theap->cert_temp_buf = buf; 01083 free_buf = 0; 01084 01085 } 01086 } 01087 if (certi_rx & 2) { 01088 if (theap->signature_temp_buf == 0) { 01089 theap->pointer_types |= 2; 01090 theap->signature_temp_buf = buf; 01091 free_buf = 0; 01092 } 01093 } 01094 if (free_buf == 0) { 01095 buf = NULL; 01096 } 01097 } 01098 } 01099 01100 if (buf) { 01101 buf = buffer_free(buf); 01102 } 01103 01104 return buf; 01105 } 01106 01107 buffer_t *tls_client_up(buffer_t *buf, sec_suite_t *tls_suite) 01108 { 01109 uint8_t i = 0, certi_rx = 0; 01110 uint16_t data_len = 0; 01111 uint8_t alert_case = 0; 01112 uint8_t *ptr; 01113 tls_header_t *tls_header_ptr; 01114 tls_heap_t *tls_heap = tls_suite->tls_session->tls_heap; 01115 uint8_t algo_ok = 0, j = 0; 01116 ptr = buffer_data_pointer(buf); 01117 01118 i = 1; 01119 while (buf->buf_ptr < buf->buf_end ) { 01120 data_len = buffer_data_length(buf); 01121 ptr = buffer_data_pointer(buf); 01122 tls_header_ptr = NULL; 01123 01124 if (data_len >= 5) { 01125 uint16_t tls_version; 01126 tls_header.type = *ptr++; 01127 tls_version = common_read_16_bit(ptr); 01128 ptr += 2; 01129 if (tls_version != TLS_1_2_VERSION) { 01130 tr_debug("Len: %04x", data_len); 01131 tr_debug("%s", tr_array(ptr, 4)); 01132 alert_case = 4; 01133 } else { 01134 tls_header.length = common_read_16_bit(ptr); 01135 ptr += 2; 01136 data_len -= 5; 01137 if (tls_header.length > data_len) { 01138 alert_case = 5; 01139 } else { 01140 tr_debug("Full TLS Record"); 01141 tls_header.ptr = ptr; 01142 buf->buf_ptr += tls_header.length; 01143 buf->buf_ptr += 5; 01144 tls_header_ptr = &tls_header; 01145 } 01146 } 01147 } else { 01148 alert_case = 5; 01149 } 01150 01151 if (alert_case) { 01152 tr_debug("TLS Segmentation or datagram error: %02x", alert_case); 01153 buf->buf_ptr = buf->buf_end ; 01154 //SET Alert Case 01155 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_INTERNAL); 01156 return buffer_free(buf); 01157 } 01158 01159 if (tls_header_ptr) { 01160 if (tls_header_ptr->type == TLS_HANDSHAKE && (tls_heap != 0)) { 01161 tr_debug("Type:Handshake"); 01162 if ((tls_suite->state == TLS_CHANGE_CHIPHER)) { 01163 if (tls_header_ptr->length < 32) { 01164 tr_debug("Too short Chiher Text"); 01165 } else if ((algo_ok & 0x20) && (tls_suite->state == PRF_CALC)) { 01166 tr_debug("Drop Client RE TX"); 01167 /*tls_text_cnt = */j = 1; 01168 } else { 01169 int8_t returnCode = tls_client_verify_handler(tls_header_ptr, tls_suite); 01170 if (returnCode == 0) 01171 { 01172 algo_ok |= 0x10; 01173 sec_lib_state_machine_trig(tls_suite, TLS_FINISH); 01174 j = 1; 01175 } else if (returnCode == -1) { 01176 sec_lib_state_machine_trig(tls_suite, PANA_ERROR); 01177 return buffer_free(buf); 01178 } else { 01179 i = 5; 01180 sec_lib_state_machine_trig(tls_suite, PANA_ERROR); 01181 break; 01182 } 01183 01184 //Set Back Originals 01185 tls_header_ptr->ptr -= 8; 01186 tls_header_ptr->length += 16; 01187 } 01188 } else { 01189 uint8_t tls_msg_cnt = 0; 01190 tls_msg_t *tls_msg_ptr = 0; 01191 if (algo_ok != 0x18) { 01192 tls_msg_cnt = tls_msg_analyzy(tls_header_ptr->ptr, tls_header_ptr->length); 01193 j = 0; 01194 } 01195 ptr = tls_header_ptr->ptr; 01196 while (j < tls_msg_cnt) { 01197 tls_msg_ptr = tls_msg_get(ptr); 01198 01199 switch (tls_msg_ptr->type) { 01200 case TLS_SERVER_HELLO: 01201 if (tls_msg_ptr->len >= 38) { 01202 if (tls_suite->state == TLS_INIT) { 01203 if (tls_parse_server_hello(tls_msg_ptr->msg_ptr, tls_suite)) { 01204 01205 uint8_t switch_state = 0; 01206 tr_debug("TLS:S_Hello OK"); 01207 if (tls_heap->tls_chipher_mode != CHIPHER_ECC) { 01208 algo_ok |= 1; 01209 switch_state = 1; 01210 tls_ecc_heap_free(tls_heap); 01211 } else { 01212 01213 #ifdef ECC 01214 tls_suite->retry_counter = 0; 01215 switch_state = 1; 01216 #else 01217 tr_debug("NO ECC Sup"); 01218 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_INTERNAL); 01219 return buffer_free(buf); 01220 #endif 01221 01222 } 01223 if (switch_state) { 01224 tls_suite->setups &= ~TLS_HANSHAKE_HASH; 01225 sec_set_auth_timeout(tls_suite, TLS_HELLO_RX); 01226 tls_suite->retry_counter = 0; 01227 tls_handshake_copy(tls_msg_ptr, tls_heap); 01228 } 01229 } else { 01230 tr_debug("TLS:S_Hello Fail: %02x", tls_suite->state); 01231 } 01232 } else { 01233 tr_debug("SERver RE Tx drop Ser Hello"); 01234 } 01235 } 01236 break; 01237 01238 case TLS_SERVER_HELLO_DONE: 01239 if (tls_msg_ptr->len == 0) { 01240 if (tls_suite->state >= TLS_CERTIFICATE_RX && tls_suite->state < PANA_ERROR) { 01241 tr_debug("TLS:S_Hello DONE"); 01242 algo_ok |= 2; 01243 tls_handshake_copy(tls_msg_ptr, tls_heap); 01244 sec_lib_state_machine_trig(tls_suite, TLS_HELLO_DONE); 01245 } else { 01246 tr_debug("Drop Ser Hello Done: %02x", tls_suite->state); 01247 } 01248 } 01249 break; 01250 01251 case TLS_CERTIFICATE: 01252 #ifdef ECC 01253 if (tls_suite->state == TLS_HELLO_RX) { 01254 tr_debug("TLS Certi RX"); 01255 01256 if (tls_parse_certificate(tls_msg_ptr->msg_ptr, tls_msg_ptr->len, tls_suite)) { 01257 01258 tls_suite->setups |= TLS_ECC_CERTIFICATE_RECEIVED; 01259 algo_ok = 0; 01260 tls_handshake_copy(tls_msg_ptr, tls_heap); 01261 tls_suite->timer = pana_retry_req_max_get(); 01262 01263 tls_suite->state = TLS_CERTIFICATE_RX; 01264 certi_rx |= 1; 01265 01266 } else { 01267 tr_debug("TLS Malformed Certificate"); 01268 01269 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_BAD_CERTIFICATE); 01270 return buffer_free(buf); 01271 } 01272 01273 } else { 01274 tr_debug("Drop Cert: %02x", tls_suite->state); 01275 return buffer_free(buf); 01276 } 01277 #else 01278 sec_lib_state_machine_trig(tls_suite, PANA_ERROR); 01279 #endif 01280 break; 01281 01282 case TLS_SERVER_KEY_EXCHANGE: 01283 tr_debug(" TLS Serv KEY Exchange RX"); 01284 #ifdef ECC 01285 if (!tls_parse_server_key_exchange(tls_msg_ptr->msg_ptr, tls_msg_ptr->len, tls_suite)) { 01286 tr_debug("Drop Key"); 01287 sec_lib_state_machine_trig(tls_suite, PANA_ERROR); 01288 } else { 01289 algo_ok = 0; 01290 tls_handshake_copy(tls_msg_ptr, tls_heap); 01291 certi_rx |= 2; 01292 sec_set_auth_timeout(tls_suite, TLS_SERVER_KEY_EXCHANGE_RX); 01293 } 01294 #else 01295 tr_debug("Drop Key"); 01296 sec_lib_state_machine_trig(tls_suite, PANA_ERROR); 01297 #endif 01298 01299 break; 01300 01301 case TLS_CERTIFICATE_REQUEST: 01302 #ifdef ECC 01303 if (tls_parse_certificate_request(tls_msg_ptr->msg_ptr, tls_msg_ptr->len)) { 01304 tr_debug(" TLS Cert request- "); 01305 if ((tls_suite->setups & TLS_ECC_CERTIFICATE_REQUESTED) == 0) { 01306 tls_suite->setups |= TLS_ECC_CERTIFICATE_REQUESTED; 01307 tls_handshake_copy(tls_msg_ptr, tls_heap); 01308 01309 } 01310 } else 01311 #endif 01312 { 01313 tr_debug("Client drop Cert Request"); 01314 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_DECRYPT); 01315 return buffer_free(buf); 01316 } 01317 break; 01318 01319 default: 01320 break; 01321 } 01322 ptr = tls_msg_ptr->msg_ptr; 01323 ptr += tls_msg_ptr->len; 01324 j++; 01325 } 01326 } 01327 01328 } else if (tls_header_ptr->type == TLS_CHANGE_CIPHER_SPEC && (tls_heap != 0) /*&& (tls_header[i].length == 1)*/) { 01329 uint8_t tx_alert = 1; 01330 tr_debug("TLS:Change ChipherS"); 01331 tr_debug("%02x", tls_suite->state); 01332 if (tls_suite->state == TLS_KEY_CHANGE) { 01333 tx_alert = 0; 01334 } 01335 01336 if (tx_alert) { 01337 tr_debug("Wrong state TX Alert"); 01338 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_CLOSE_FATAL); 01339 return buffer_free(buf); 01340 } else { 01341 sec_set_auth_timeout(tls_suite, TLS_CHANGE_CHIPHER); 01342 algo_ok |= 8; 01343 } 01344 01345 } else if (tls_header_ptr->type == TLS_ALERT_TYPE) { 01346 tr_debug("Alert!!"); 01347 if (tls_header_ptr->length == 2) { 01348 uint8_t *dptr = tls_header_ptr->ptr; 01349 tr_debug("%s", tr_array(tls_header_ptr->ptr, 2)); 01350 //Skip Alert Type and descriptions 01351 dptr += 2; 01352 algo_ok = 0xf0; 01353 sec_lib_state_machine_trig(tls_suite, PANA_FAILURE); 01354 } 01355 i = 0xfe; 01356 } 01357 } 01358 } 01359 01360 if (algo_ok) { 01361 if (tls_suite->state == TLS_HELLO_RX) { 01362 sec_set_auth_timeout(tls_suite, TLS_HELLO_RX); 01363 tls_suite->retry_counter = 0; 01364 i = 0xff; 01365 } else if (tls_suite->state == TLS_HELLO_DONE) { 01366 //ADD already Now Client key change handshake part 01367 #ifdef ECC 01368 if (tls_heap->tls_chipher_mode == CHIPHER_ECC) { 01369 if (tls_suite->setups & TLS_ECC_CERTIFICATE_REQUESTED) { 01370 tr_debug("Message verify start"); 01371 sec_lib_state_machine_trig(tls_suite, TLS_ECC_MESSAGE_VERIFY_START); 01372 } else { 01373 tr_debug("Cert REQ diabled"); 01374 } 01375 } else 01376 #endif 01377 { 01378 01379 tls_msg_t *tmp_msg = tls_msg_ptr_get(); 01380 01381 tmp_msg->len = 3; 01382 if (tls_suite->psk_key_id > 0xff) { 01383 tmp_msg->len++; 01384 } 01385 ptr = buf->buf ; 01386 *ptr++ = TLS_CLIENT_KEY_EXCHANGE; 01387 ptr = common_write_24_bit(tmp_msg->len, ptr); 01388 tmp_msg->msg_ptr = ptr; 01389 ptr = common_write_16_bit(tmp_msg->len - 2, ptr); 01390 if (tls_suite->psk_key_id > 0xff) { 01391 *ptr++ = tls_suite->psk_key_id >> 8; 01392 } 01393 01394 *ptr = tls_suite->psk_key_id;; 01395 tls_handshake_copy(tmp_msg, tls_heap); 01396 sec_prf_state_set(tls_suite); 01397 } 01398 i = 0xff; 01399 } else if (tls_suite->state == TLS_CHANGE_CHIPHER) { 01400 tr_debug("No Chipher Set Close state"); 01401 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_INTERNAL); 01402 i = 0xff; 01403 } else if (tls_suite->state == TLS_FINISH) { 01404 tr_debug("Finish RX"); 01405 sec_lib_state_machine_trig(tls_suite, TLS_FINISH); 01406 i = 0xff; 01407 }else if (algo_ok == 0x18) { 01408 01409 } 01410 else { 01411 i = 11; 01412 tr_debug("%02x", algo_ok); 01413 } 01414 } 01415 01416 if (i) { 01417 buf = tls_certificate_buffer_store(buf, certi_rx, tls_suite); 01418 } 01419 return (buf); 01420 } 01421 01422 01423 01424 buffer_t *tls_server_up(buffer_t *buf, sec_suite_t *tls_suite) 01425 { 01426 #ifdef PANA_SERVER_API 01427 uint8_t i = 0, certi_rx = 0; 01428 uint16_t data_len = 0; 01429 uint8_t alert_case = 0; 01430 uint8_t *ptr; 01431 tls_header_t *tls_header_ptr; 01432 tls_heap_t *tls_heap = tls_suite->tls_session->tls_heap; 01433 uint8_t algo_ok = 0, j = 0; 01434 ptr = buffer_data_pointer(buf); 01435 01436 i = 1; 01437 while (buf->buf_ptr < buf->buf_end ) { 01438 data_len = buffer_data_length(buf); 01439 ptr = buffer_data_pointer(buf); 01440 tls_header_ptr = NULL; 01441 01442 if (data_len >= 5) { 01443 uint16_t tls_version; 01444 tls_header.type = *ptr++; 01445 tls_version = common_read_16_bit(ptr); 01446 ptr += 2; 01447 if (tls_version != TLS_1_2_VERSION) { 01448 tr_debug("Len: %04x", data_len); 01449 tr_debug("%s", tr_array(ptr, 4)); 01450 alert_case = 4; 01451 } else { 01452 tls_header.length = common_read_16_bit(ptr); 01453 ptr += 2; 01454 data_len -= 5; 01455 if (tls_header.length > data_len) { 01456 alert_case = 5; 01457 } else { 01458 tr_debug("Full TLS Record"); 01459 tls_header.ptr = ptr; 01460 buf->buf_ptr += tls_header.length; 01461 buf->buf_ptr += 5; 01462 tls_header_ptr = &tls_header; 01463 } 01464 } 01465 } else { 01466 alert_case = 5; 01467 } 01468 01469 if (alert_case) { 01470 tr_debug("TLS Segmentation or datagram error: %02x", alert_case); 01471 buf->buf_ptr = buf->buf_end ; 01472 //SET Alert Case 01473 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_INTERNAL); 01474 return buffer_free(buf); 01475 } 01476 01477 if (tls_header_ptr) { 01478 if (tls_header_ptr->type == TLS_HANDSHAKE && (tls_heap != 0)) { 01479 tr_debug("Type:Handshake"); 01480 if ((tls_suite->state == TLS_CHANGE_CHIPHER)) { 01481 if (tls_header_ptr->length < 32) { 01482 tr_debug("Too short Chiher Text"); 01483 } else if ((algo_ok & 0x20) && (tls_suite->state == PRF_CALC)) { 01484 tr_debug("Drop Client RE TX"); 01485 /*tls_text_cnt = */j = 1; 01486 } else { 01487 buf = tls_verify_handler(certi_rx,tls_header_ptr, buf, tls_suite); 01488 if (!buf) { 01489 return buf; 01490 } 01491 } 01492 } else { 01493 uint8_t tls_msg_cnt = 0; 01494 tls_msg_t *tls_msg_ptr = 0; 01495 if (algo_ok != 0x18) { 01496 tls_msg_cnt = tls_msg_analyzy(tls_header_ptr->ptr, tls_header_ptr->length); 01497 j = 0; 01498 } 01499 ptr = tls_header_ptr->ptr; 01500 while (j < tls_msg_cnt) { 01501 tls_msg_ptr = tls_msg_get(ptr); 01502 01503 switch (tls_msg_ptr->type) { 01504 case TLS_CLIENT_HELLO: 01505 //Parse 01506 if (tls_parse_client_hello(tls_msg_ptr->msg_ptr, tls_msg_ptr->len, tls_suite)) { 01507 tr_debug("TLS:C_Hello OK"); 01508 algo_ok = 0; 01509 tls_heap->tls_handshake_h_len = 0; 01510 tls_handshake_copy(tls_msg_ptr, tls_heap); 01511 if (tls_heap->tls_chipher_mode == CHIPHER_ECC) { 01512 #ifdef ECC 01513 sec_lib_state_machine_trig(tls_suite, TLS_SERVER_ECC_PUB_KEY_GEN); 01514 #else 01515 tr_debug("NO ECC Sup"); 01516 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_INTERNAL); 01517 return buffer_free(buf); 01518 #endif 01519 01520 } else { 01521 tls_ecc_heap_free(tls_heap); 01522 sec_lib_state_machine_trig(tls_suite, TLS_SERVER_TX_SERVER_HELLO); 01523 } 01524 01525 } else { 01526 tr_debug("TLS:C_Hello Fail"); 01527 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_INTERNAL); 01528 return buffer_free(buf); 01529 } 01530 break; 01531 01532 case TLS_CERTIFICATE: 01533 #ifdef ECC 01534 01535 if (tls_suite->state == TLS_TX_SERVER_KEY_EXCHANGE || tls_suite->state == TLS_SERVER_WAIT_CHANGE_CHIPHERSUITE) { 01536 tr_debug("TLS Certi RX"); 01537 01538 if (tls_parse_certificate(tls_msg_ptr->msg_ptr, tls_msg_ptr->len, tls_suite)) { 01539 01540 tls_suite->setups |= TLS_ECC_CERTIFICATE_RECEIVED; 01541 algo_ok = 0; 01542 tls_handshake_copy(tls_msg_ptr, tls_heap); 01543 tls_suite->timer = pana_retry_req_max_get(); 01544 tls_suite->state = TLS_CERTIFICATE_RX; 01545 certi_rx |= 1; 01546 01547 } else { 01548 tr_debug("TLS Malformed Certificate"); 01549 01550 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_BAD_CERTIFICATE); 01551 return buffer_free(buf); 01552 } 01553 01554 } else { 01555 tr_debug("Drop Cert: %02x", tls_suite->state); 01556 return buffer_free(buf); 01557 } 01558 #else 01559 sec_lib_state_machine_trig(tls_suite, PANA_ERROR); 01560 #endif 01561 break; 01562 01563 case TLS_CLIENT_KEY_EXCHANGE: 01564 tr_debug(" TLS Client KEY Exchange RX"); 01565 if (tls_heap->tls_chipher_mode == CHIPHER_PSK) { 01566 uint8_t *d_ptr = tls_msg_ptr->msg_ptr; 01567 uint16_t key_len; 01568 uint16_t received_key_id = 0; 01569 01570 key_len = common_read_16_bit(d_ptr); 01571 d_ptr += 2; 01572 01573 if (key_len) { 01574 if (key_len == 2) { 01575 received_key_id = (*d_ptr++) << 8; 01576 } 01577 received_key_id += *d_ptr; 01578 } 01579 01580 if (tls_get_key(received_key_id) != NULL) { 01581 tls_suite->psk_key_id = received_key_id; 01582 01583 if (tls_suite->state != PRF_CALC) { 01584 tr_debug("Client KEY Exchange "); 01585 tls_handshake_copy(tls_msg_ptr, tls_heap); 01586 algo_ok = 0; 01587 } else { 01588 tr_debug("Client Re TX"); 01589 } 01590 } 01591 01592 /* Not valid Key ID */ 01593 else { 01594 tr_debug("Server drop Client Key Exchange"); 01595 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_DECRYPT); 01596 return buffer_free(buf); 01597 } 01598 } else { 01599 #ifdef ECC 01600 if (tls_parse_client_key_exchange(tls_msg_ptr->msg_ptr, tls_msg_ptr->len, tls_suite)) { 01601 algo_ok = 0; 01602 tls_handshake_copy(tls_msg_ptr, tls_heap); 01603 sec_set_auth_timeout(tls_suite, TLS_CLIENT_KEY_EXCHANGE_RX); 01604 } else 01605 #endif 01606 { 01607 tr_debug("Server drop Client Key EX"); 01608 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_DECRYPT); 01609 return buffer_free(buf); 01610 } 01611 } 01612 break; 01613 01614 case TLS_CERTIFICATE_VERIFY: 01615 tr_debug(" TLS Cert Verify "); 01616 #ifdef ECC 01617 if (tls_parse_certificate_verify(tls_msg_ptr->msg_ptr, tls_msg_ptr->len, tls_suite)) { 01618 01619 if ((tls_suite->setups & TLS_ECC_CERTIFICATE_VERIFY) == 0) { 01620 tr_debug("Calc Hash for Cert Verify"); 01621 tls_suite->setups |= TLS_ECC_CERTIFICATE_VERIFY; 01622 tls_hanshake_hash_cal(tls_heap); 01623 tls_handshake_copy(tls_msg_ptr, tls_heap); 01624 certi_rx |= 2; 01625 } 01626 } else 01627 #endif 01628 { 01629 tr_debug("Client Cert Verfify fail"); 01630 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_DECRYPT); 01631 return buffer_free(buf); 01632 } 01633 break; 01634 default: 01635 break; 01636 } 01637 ptr = tls_msg_ptr->msg_ptr; 01638 ptr += tls_msg_ptr->len; 01639 j++; 01640 } 01641 } 01642 01643 } else if (tls_header_ptr->type == TLS_CHANGE_CIPHER_SPEC && (tls_heap != 0) /*&& (tls_header[i].length == 1)*/) { 01644 uint8_t tx_alert = 1; 01645 tr_debug("TLS:Change ChipherS"); 01646 tr_debug("%02x", tls_suite->state); 01647 if (tls_suite->state == TLS_CLIENT_KEY_EXCHANGE_RX || tls_suite->state == TLS_SERVER_WAIT_CHANGE_CHIPHERSUITE) { 01648 tx_alert = 0; 01649 } 01650 01651 if (tx_alert) { 01652 tr_debug("Wrong state TX Alert"); 01653 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_CLOSE_FATAL); 01654 return buffer_free(buf); 01655 } else { 01656 sec_set_auth_timeout(tls_suite, TLS_CHANGE_CHIPHER); 01657 algo_ok |= 8; 01658 } 01659 01660 } else if (tls_header_ptr->type == TLS_ALERT_TYPE) { 01661 tr_debug("Alert!!"); 01662 if (tls_header_ptr->length == 2) { 01663 uint8_t *dptr = tls_header_ptr->ptr; 01664 tr_debug("%s", tr_array(tls_header_ptr->ptr, 2)); 01665 //Skip Alert Type and descriptions 01666 dptr += 2; 01667 algo_ok = 0xf0; 01668 sec_lib_state_machine_trig(tls_suite, PANA_FAILURE); 01669 } 01670 i = 0xfe; 01671 } 01672 } 01673 } 01674 if (algo_ok) { 01675 if (tls_suite->state == TLS_CHANGE_CHIPHER) { 01676 tr_debug("No Chipher RX--TXalert"); 01677 sec_lib_state_machine_trig(tls_suite, TLS_ALERT_INTERNAL); 01678 i = 0xff; 01679 } else if (algo_ok == 0x18) { 01680 01681 } 01682 else { 01683 i = 11; 01684 tr_debug("%02x", algo_ok); 01685 } 01686 } 01687 01688 if (i) { 01689 buf = tls_certificate_buffer_store(buf, certi_rx, tls_suite); 01690 } 01691 #else 01692 if (buf) { 01693 buf = buffer_free(buf); 01694 } 01695 #endif 01696 return (buf); 01697 } 01698 01699 01700 buffer_t * tls_client_hello_build(buffer_t *buf, sec_suite_t *tls_suite) 01701 { 01702 uint8_t *ptr; 01703 tls_msg_t *tmp_msg = tls_msg_ptr_get(); 01704 tls_heap_t *tls_heap = tls_suite->tls_session->tls_heap; 01705 tr_debug("TTLs TX:Client Hello"); 01706 //Build Client Hello 01707 ptr = buffer_data_clear(buf); 01708 //for Hash calculation 01709 01710 *ptr++ = TLS_CLIENT_HELLO; 01711 ptr += 3; // skip length, fill in at the end 01712 tmp_msg->msg_ptr = ptr; 01713 ptr = common_write_16_bit(TLS_1_2_VERSION, ptr); 01714 memcpy(ptr, (tls_heap->tls_hello_random + CLIENT_HELLO_PTR), 32); 01715 ptr += 32; 01716 *ptr++ = 0; //Session ID length 01717 ptr += 2; // Skip cipher suite length; fill in a moment 01718 uint8_t *ciphers_ptr = ptr; 01719 #ifdef ECC 01720 if (tls_suite->supported_chipher_suites & SEC_CIPHERSUITE_ECC) { 01721 ptr = common_write_16_bit(TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, ptr); 01722 ptr = common_write_16_bit(TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_COMPAT, ptr); 01723 } 01724 #endif 01725 if (tls_suite->supported_chipher_suites & SEC_CIPHERSUITE_PSK) { 01726 ptr = common_write_16_bit(TLS_PSK_WITH_AES_128_CCM_8, ptr); 01727 } 01728 // Go back and fill in length 01729 common_write_16_bit(ptr - ciphers_ptr, ciphers_ptr - 2); 01730 01731 *ptr++ = 1; // 1 Compression method 01732 *ptr++ = TLS_COMPRESSION_METHOD_NULL; 01733 #ifdef ECC 01734 01735 //Set ECC Extensions 01736 if (tls_suite->supported_chipher_suites & SEC_CIPHERSUITE_ECC) { 01737 ptr = common_write_16_bit(8 + 8 + 6, ptr); //Extensions length 01738 01739 ptr = common_write_16_bit(TLS_EXTENSION_SIGNATURE_ALGORITHMS, ptr); 01740 ptr = common_write_16_bit(4, ptr); //extension data len 01741 ptr = common_write_16_bit(2, ptr); //algorithm list len 01742 ptr = common_write_16_bit(TLS_SIG_HASH_ALG_SHA256_ECDSA, ptr); 01743 01744 ptr = common_write_16_bit(TLS_EXTENSION_ELLIPTIC_CURVES, ptr); 01745 ptr = common_write_16_bit(4, ptr); //extension data len 01746 ptr = common_write_16_bit(2, ptr); //curve list len 01747 ptr = common_write_16_bit(TLS_NAMED_CURVE_SECP256R1, ptr); 01748 01749 ptr = common_write_16_bit(TLS_EXTENSION_EC_POINT_FORMATS, ptr); 01750 ptr = common_write_16_bit(2, ptr); //extension data len 01751 *ptr++ = 1; // format list len 01752 *ptr++ = 0; //Uncompressed mode 01753 } 01754 #endif 01755 buffer_data_end_set(buf, ptr); 01756 01757 // Go back and write the length 01758 uint16_t tls_len = buffer_data_length(buf) - 4; 01759 tmp_msg->len = tls_len; 01760 common_write_24_bit(tls_len, buffer_data_pointer(buf) + 1); 01761 01762 tls_heap->tls_handshake_h_len = 0; 01763 tls_handshake_copy(tmp_msg, tls_heap); 01764 tls_suite->setups |= TLS_HANSHAKE_HASH; 01765 return tls_down(buf); 01766 01767 } 01768 01769 #ifdef ECC 01770 uint8_t *tls_server_key_excahnge_msg_build(uint8_t *ptr , tls_heap_t *heap_ptr) 01771 { 01772 uint8_t r_zeros; 01773 uint8_t s_zeros; 01774 01775 r_zeros = tls_get_leading_zeros(heap_ptr->ecc_heap->sgnt->m_R.data); 01776 s_zeros = tls_get_leading_zeros(heap_ptr->ecc_heap->sgnt->m_s.data); 01777 *ptr++ = TLS_SERVER_KEY_EXCHANGE; 01778 ptr = common_write_24_bit((145 - r_zeros - s_zeros), ptr); 01779 *ptr++ = 3; //type 01780 ptr = common_write_16_bit(TLS_NAMED_CURVE_SECP256R1, ptr); 01781 //There shuold be calculated case now only test purpose 01782 *ptr++ = 65; //len 01783 *ptr++ = 4; //type 01784 memcpy(ptr, heap_ptr->ecc_heap->server_public_key, 64); 01785 ptr += 64; 01786 ptr = common_write_16_bit(TLS_SIG_HASH_ALG_SHA256_ECDSA, ptr); 01787 ptr = common_write_16_bit((72 - r_zeros - s_zeros), ptr); 01788 *ptr++ = 0x30; 01789 *ptr++ = 70 - r_zeros - s_zeros; 01790 ptr += tls_write_signature_parameters(ptr, ((uint8_t *)heap_ptr->ecc_heap->sgnt->m_R.data), r_zeros); 01791 ptr += tls_write_signature_parameters(ptr, ((uint8_t *)heap_ptr->ecc_heap->sgnt->m_s.data), s_zeros); 01792 return ptr; 01793 } 01794 01795 01796 uint8_t *tls_certificate_verify_msg_set(uint8_t *ptr, tls_heap_t *heap_ptr) 01797 { 01798 uint8_t r_zeros; 01799 uint8_t s_zeros; 01800 r_zeros = tls_get_leading_zeros(heap_ptr->ecc_heap->sgnt->m_R.data); 01801 s_zeros = tls_get_leading_zeros(heap_ptr->ecc_heap->sgnt->m_s.data); 01802 01803 *ptr++ = TLS_CERTIFICATE_VERIFY; 01804 ptr = common_write_24_bit((76 - r_zeros - s_zeros), ptr); 01805 *ptr++ = 4; 01806 *ptr++ = 3; 01807 *ptr++ = 0; 01808 *ptr++ = 72 - r_zeros - s_zeros; 01809 *ptr++ = 0x30; 01810 *ptr++ = 70 - r_zeros - s_zeros; 01811 ptr += tls_write_signature_parameters(ptr, ((uint8_t *)heap_ptr->ecc_heap->sgnt->m_R.data), r_zeros); 01812 ptr += tls_write_signature_parameters(ptr, ((uint8_t *)heap_ptr->ecc_heap->sgnt->m_s.data), s_zeros); 01813 return ptr; 01814 } 01815 #define CERTI_CHAIN_3 01816 01817 uint16_t tls_certificate_len(certificate_chain_internal_t *temp) 01818 { 01819 uint8_t i; 01820 uint16_t len = 0; 01821 01822 if (temp) { 01823 len += 10; 01824 if (temp->chain_length > 1) { 01825 for (i = 0; i < (temp->chain_length - 1); i++) { 01826 if (i) { 01827 len += 3; 01828 } 01829 len += temp->certi_len[i + 1]; 01830 } 01831 } else if (temp->chain_length == 1) { 01832 len += temp->certi_len[0]; 01833 } 01834 } 01835 return len; 01836 } 01837 01838 uint8_t *tls_certificate_msg_set(uint8_t *ptr, certificate_chain_internal_t *temp) 01839 { 01840 uint8_t i; 01841 uint16_t len = 0; 01842 len = tls_certificate_len(temp); 01843 if (temp) { 01844 len -= 4; // Cut TLS haeder space off 01845 /* Set Certificate */ 01846 *ptr++ = TLS_CERTIFICATE; 01847 ptr = common_write_24_bit(len, ptr); 01848 len -= 3; 01849 ptr = common_write_24_bit(len, ptr); 01850 01851 i = temp->chain_length; 01852 if (i > 1) { 01853 while (i) { 01854 i--; 01855 if (i) { 01856 ptr = common_write_24_bit(temp->certi_len[i], ptr); 01857 memcpy(ptr, temp->certi_chain[i], temp->certi_len[i]); 01858 ptr += temp->certi_len[i]; 01859 } 01860 } 01861 } else if (i == 1) { 01862 ptr = common_write_24_bit(temp->certi_len[0], ptr); 01863 memcpy(ptr, temp->certi_chain[0], temp->certi_len[0]); 01864 ptr += temp->certi_len[0]; 01865 } 01866 } 01867 return ptr; 01868 } 01869 01870 uint8_t tls_write_signature_parameters(uint8_t *ptr, uint8_t *signature_parameter, uint8_t leadin_zeros) 01871 { 01872 uint8_t len = 2; 01873 uint8_t i; 01874 *ptr++ = 2; 01875 *ptr++ = 33 - leadin_zeros; 01876 if (leadin_zeros == 0) { 01877 *ptr++ = 0; 01878 len += 33; 01879 } else { 01880 leadin_zeros -= 1; 01881 len += (32 - leadin_zeros); 01882 } 01883 for (i = leadin_zeros; i < 32; i++) { 01884 *ptr++ = signature_parameter[31 - i]; 01885 } 01886 return len; 01887 } 01888 01889 void tls_ecc_point_reverse_order(uint8_t *dst, uint8_t *src) 01890 { 01891 uint8_t i; 01892 for (i = 0; i < 32; i++) { 01893 dst[i] = src[31 - i]; 01894 } 01895 } 01896 #endif 01897 01898 uint8_t *tls_build_server_hello_msg(uint8_t *ptr, tls_session_t *tls_session) 01899 { 01900 tls_heap_t *heap_ptr = tls_session->tls_heap; 01901 *ptr++ = TLS_SERVER_HELLO; 01902 ptr += 3; // fill length in at the end 01903 uint8_t *startptr = ptr; 01904 ptr = common_write_16_bit(TLS_1_2_VERSION, ptr); 01905 01906 memcpy(ptr, (heap_ptr->tls_hello_random + SERVER_HELLO_PTR), 32); 01907 ptr += 32; 01908 01909 *ptr++ = tls_session->id_length; 01910 memcpy(ptr, tls_session->tls_session_id, tls_session->id_length); 01911 ptr += tls_session->id_length; 01912 01913 uint16_t ciphersuite; 01914 #ifdef ECC 01915 if (heap_ptr->tls_chipher_mode == CHIPHER_ECC) { 01916 ciphersuite = heap_ptr->client_knows_standard_ecc_ciphersuite ? 01917 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 : 01918 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_COMPAT; 01919 } else 01920 #endif 01921 { 01922 ciphersuite = TLS_PSK_WITH_AES_128_CCM_8; 01923 } 01924 01925 ptr = common_write_16_bit(ciphersuite, ptr); 01926 *ptr++ = TLS_COMPRESSION_METHOD_NULL; 01927 01928 if (heap_ptr->tls_chipher_mode == CHIPHER_ECC) { 01929 ptr = common_write_16_bit(6, ptr); // 6 bytes of Extensions 01930 ptr = common_write_16_bit(TLS_EXTENSION_EC_POINT_FORMATS, ptr); 01931 ptr = common_write_16_bit(2, ptr); // 2 bytes of extension data 01932 *ptr++ = 1; // 1 byte of ec_point_format_list 01933 *ptr++ = 0; // ECPointFormat::uncompressed 01934 } 01935 01936 // Go back and fill in length 01937 common_write_24_bit(ptr - startptr, startptr - 3); 01938 01939 if (heap_ptr->tls_chipher_mode != CHIPHER_ECC) { 01940 *ptr++ = TLS_SERVER_HELLO_DONE; 01941 ptr = common_write_24_bit(0, ptr); // length 01942 } 01943 return ptr; 01944 } 01945 01946 void tls_header_set(buffer_t *buf) 01947 { 01948 uint8_t *ptr; 01949 uint16_t len; 01950 ptr = buffer_data_pointer(buf); 01951 len = buffer_data_length(buf); 01952 len -= 5; //Cut Flags byte off 01953 *ptr++ = TLS_HANDSHAKE; 01954 ptr = common_write_16_bit(TLS_1_2_VERSION, ptr); 01955 ptr = common_write_16_bit(len, ptr); 01956 } 01957 01958 void tls_session_id_genrate(uint8_t *suite, uint8_t length) 01959 { 01960 if (length > 32) { 01961 length = 32; 01962 } 01963 randLIB_get_n_bytes_random(suite, length); 01964 } 01965 01966 tls_heap_t *tls_heap_allocate(void) 01967 { 01968 tls_heap_t *heap_ptr = tls_heap_structure_allocate(); 01969 if (heap_ptr) { 01970 #ifdef ECC 01971 tls_ecc_heap_t *ecc_ptr = ecc_allocate_ram(); 01972 if (ecc_ptr == 0) { 01973 tr_debug("ECC Alloc Fail"); 01974 ns_dyn_mem_free(heap_ptr); 01975 heap_ptr = 0; 01976 return heap_ptr; 01977 } else { 01978 //uint8_t *ptr, i; 01979 heap_ptr->ecc_heap = ecc_ptr; 01980 } 01981 heap_ptr->client_knows_standard_ecc_ciphersuite = false; 01982 #endif 01983 randLIB_get_n_bytes_random(heap_ptr->tls_hello_random , 64); 01984 ns_sha256_init(&heap_ptr->sha256_ctx); 01985 heap_ptr->tls_chipher_mode = CHIPHER_NONE; 01986 heap_ptr->tls_handshake_h_len = 0; 01987 heap_ptr->client_verify_buf = 0; 01988 heap_ptr->client_verify_buf_len = 0; 01989 } 01990 return heap_ptr; 01991 } 01992 01993 void tls_heap_free(tls_heap_t *heap_ptr) 01994 { 01995 if (heap_ptr) { 01996 if (heap_ptr->cert_temp_buf) { 01997 if (heap_ptr->signature_temp_buf) { 01998 if (heap_ptr->signature_temp_buf == heap_ptr->cert_temp_buf) { 01999 heap_ptr->signature_temp_buf = 0; 02000 } 02001 02002 02003 } 02004 02005 if (heap_ptr->pointer_types & 1) { 02006 buffer_free(heap_ptr->cert_temp_buf); 02007 } else { 02008 ns_dyn_mem_free(heap_ptr->cert_temp_buf); 02009 } 02010 heap_ptr->cert_temp_buf = 0; 02011 } 02012 if (heap_ptr->signature_temp_buf) { 02013 if (heap_ptr->pointer_types & 2) { 02014 buffer_free(heap_ptr->signature_temp_buf); 02015 } else { 02016 ns_dyn_mem_free(heap_ptr->signature_temp_buf); 02017 } 02018 heap_ptr->signature_temp_buf = 0; 02019 } 02020 if (heap_ptr->client_verify_buf) { 02021 ns_dyn_mem_free(heap_ptr->client_verify_buf); 02022 heap_ptr->client_verify_buf = 0; 02023 } 02024 tls_ecc_heap_free(heap_ptr); 02025 ns_sha256_free(&heap_ptr->sha256_ctx); 02026 ns_dyn_mem_free(heap_ptr); 02027 } 02028 } 02029 #ifdef ECC 02030 void tls_ecc_heap_free(tls_heap_t *heap_ptr) 02031 { 02032 if (heap_ptr) { 02033 if (heap_ptr->ecc_heap) { 02034 if (heap_ptr->ecc_heap->sgnt) { 02035 ecc_library_free_pointer(heap_ptr->ecc_heap->sgnt); 02036 //ns_dyn_mem_free(heap_ptr->ecc_heap->sgnt); 02037 } 02038 ns_dyn_mem_free(heap_ptr->ecc_heap); 02039 heap_ptr->ecc_heap = 0; 02040 } 02041 } 02042 } 02043 #endif 02044 02045 #ifdef ECC 02046 uint8_t tls_get_leading_zeros(void *data) 02047 { 02048 02049 uint8_t *ptr = (uint8_t *)data + 31; 02050 uint8_t i = 0; 02051 02052 for (;; ptr--) { 02053 if (*ptr & 0x80) { 02054 break; 02055 } 02056 i++; 02057 if (i == 33) { 02058 break; 02059 } 02060 02061 if (*ptr) { 02062 break; 02063 } 02064 } 02065 02066 return i; 02067 02068 } 02069 #endif 02070 02071 02072 void tls_key_expansion_cal(tls_heap_t *heap_ptr, uint8_t *key_save_ptr, uint8_t *master_secret) 02073 { 02074 uint8_t *ptr; 02075 prf_sec_param_t *prf_ptr = shalib_prf_param_get(); 02076 prf_ptr->secret = master_secret; 02077 prf_ptr->sec_len = 48; 02078 prf_ptr->label = "key expansion"; 02079 prf_ptr->seed = heap_ptr->temp_buf; 02080 ptr = heap_ptr->temp_buf; 02081 memcpy(ptr, (heap_ptr->tls_hello_random + SERVER_HELLO_PTR) , 32); 02082 ptr += 32; 02083 memcpy(ptr, (heap_ptr->tls_hello_random + CLIENT_HELLO_PTR) , 32); 02084 prf_ptr->seedlen = 64; 02085 shalib_prf_calc(key_save_ptr, 10); // Why 40 bytes? 02086 } 02087 02088 void tls_master_key_cal(tls_heap_t *heap_ptr, sec_suite_t *tls_suite) 02089 { 02090 uint8_t *ptr; 02091 prf_sec_param_t *prf_ptr = shalib_prf_param_get(); 02092 uint8_t secret_buf[2 + 16 + 2 + 16]; 02093 tr_debug("CAL Master secret:"); 02094 //Her have to to be set check is 02095 #ifdef ECC 02096 if (heap_ptr->tls_chipher_mode == CHIPHER_ECC) { 02097 prf_ptr->secret = heap_ptr->ecc_heap->pre_secret_mat; 02098 prf_ptr->sec_len = 32; 02099 } else 02100 #endif 02101 { 02102 tls_psk_key_t *key_temp = tls_get_key(tls_suite->psk_key_id); 02103 if (key_temp) { 02104 /* RFC 4279 - premaster secret for N-octet PSK is 02105 * +----------+----------+----------+----------+ 02106 * | 2 octets | N octets | 2 octets | N octets | 02107 * +----------+----------+----------+----------+ 02108 * | N | 0 | N | PSK | 02109 * +----------+----------+----------+----------+ 02110 */ 02111 ptr = secret_buf; 02112 ptr = common_write_16_bit(16, ptr); 02113 memset(ptr, 0, 16), ptr += 16; 02114 ptr = common_write_16_bit(16, ptr); 02115 memcpy(ptr, key_temp->psk_key, 16); 02116 prf_ptr->secret = secret_buf; 02117 prf_ptr->sec_len = sizeof secret_buf; 02118 } 02119 } 02120 prf_ptr->label = "master secret"; 02121 prf_ptr->seed = heap_ptr->temp_buf; 02122 ptr = heap_ptr->temp_buf; 02123 memcpy(ptr, (heap_ptr->tls_hello_random + CLIENT_HELLO_PTR) , 32); 02124 ptr += 32; 02125 memcpy(ptr, (heap_ptr->tls_hello_random + SERVER_HELLO_PTR) , 32); 02126 prf_ptr->seedlen = 64; 02127 02128 shalib_prf_calc(tls_suite->tls_session->master_secret, 12); 02129 } 02130 02131 void tls_verify_calc(uint8_t output[12], uint8_t server, tls_heap_t *heap_ptr, uint8_t *master_secret) 02132 { 02133 prf_sec_param_t *prf_ptr = shalib_prf_param_get(); 02134 prf_ptr->secret = master_secret; 02135 prf_ptr->sec_len = 48; 02136 prf_ptr->label = server ? "server finished" : "client finished"; 02137 prf_ptr->seed = heap_ptr->hash_buf; 02138 prf_ptr->seedlen = 32; 02139 shalib_prf_calc(output, 3); 02140 } 02141 02142 02143 void tls_handshake_copy(tls_msg_t *tls_msg_ptr, tls_heap_t *heap_ptr) 02144 { 02145 uint16_t len = tls_msg_ptr->len; 02146 uint8_t *ptr = tls_msg_ptr->msg_ptr; 02147 ptr -= 4; 02148 len += 4; 02149 02150 if (heap_ptr->tls_handshake_h_len == 0) { 02151 ns_sha256_starts(&heap_ptr->sha256_ctx); 02152 } 02153 ns_sha256_update(&heap_ptr->sha256_ctx, ptr, len); 02154 heap_ptr->tls_handshake_h_len += len; 02155 } 02156 02157 02158 void tls_hanshake_hash_cal(tls_heap_t *heap_ptr) 02159 { 02160 tr_debug("HASH Calc"); 02161 ns_sha256_context ctx; 02162 ns_sha256_clone(&ctx, &heap_ptr->sha256_ctx); 02163 ns_sha256_finish(&ctx, heap_ptr->hash_buf); 02164 ns_sha256_free(&ctx); 02165 } 02166 02167 #if 0 02168 uint8_t tls_txt_analyze(buffer_t *buf) 02169 { 02170 uint8_t *dptr; 02171 uint8_t tls_text_cnt = 0; 02172 uint16_t data_len = buffer_data_length(buf); 02173 uint16_t readed = 0; 02174 dptr = buffer_data_pointer(buf); 02175 02176 while (readed < data_len) { 02177 uint16_t tls_version; 02178 tls_header.type = *dptr++; 02179 tls_version = common_read_16_bit(dptr); 02180 dptr += 2; 02181 if (tls_version == TLS_1_2_VERSION) { 02182 tls_text_cnt = 0; 02183 break; 02184 } else { 02185 uint16_t tls_temp_var_16; 02186 tls_temp_var_16 = common_read_16_bit(dptr); 02187 dptr += 2; 02188 if (tls_temp_var_16) { 02189 tls_header.length = tls_temp_var_16; 02190 tls_header.ptr = dptr; 02191 02192 readed += 5; 02193 readed += tls_temp_var_16; 02194 02195 if (readed > data_len) { 02196 tr_debug("Over Read1: %02x", tls_header.type); 02197 tr_debug("LEN: %04x", data_len); 02198 tr_debug("Read: %04x", readed); 02199 tls_text_cnt = 0; 02200 break; 02201 } else { 02202 dptr += tls_temp_var_16; 02203 tls_text_cnt++; 02204 } 02205 } else { 02206 tls_text_cnt = 0; 02207 break;; 02208 } 02209 } 02210 } 02211 02212 if (readed != data_len) { 02213 tr_debug("TSL txt Parse Fail"); 02214 tls_text_cnt = 0; 02215 } 02216 return tls_text_cnt; 02217 } 02218 #endif 02219 02220 #if 0 02221 tls_header_t *tls_message_get(uint8_t *dptr) 02222 { 02223 uint16_t tls_temp_var_16; 02224 tls_header.type = *dptr; 02225 dptr += 3; 02226 tls_temp_var_16 = common_read_16_bit(dptr); 02227 dptr += 2; 02228 tls_header.length = tls_temp_var_16; 02229 tls_header.ptr = dptr; 02230 return &tls_header; 02231 } 02232 #endif 02233 02234 uint8_t tls_msg_analyzy(uint8_t *ptr, uint16_t data_len) 02235 { 02236 uint8_t *dptr; 02237 uint8_t msg_cnt = 0; 02238 uint16_t readed = 0, m_len = 0; 02239 dptr = ptr; 02240 while (readed < data_len) { 02241 dptr += 1; //Skip Type 02242 if (*dptr++) { 02243 //Too long skip packet 02244 tr_debug("Too long: %s", tr_array(ptr, data_len)); 02245 msg_cnt = 0; 02246 break; 02247 } else { 02248 m_len = common_read_16_bit(dptr); 02249 dptr += 2; 02250 } 02251 readed += 4; 02252 readed += m_len; 02253 dptr += m_len; 02254 02255 if (readed > data_len) { 02256 tr_debug("Over Read1: %02x", tls_msg.type); 02257 tr_debug("LEN: %04x", data_len); 02258 tr_debug("Read: %04x", readed); 02259 msg_cnt = 0; 02260 break; 02261 } else { 02262 msg_cnt++; 02263 } 02264 } 02265 if (readed != data_len) { 02266 tr_debug("TLS MSG Parse Fail"); 02267 msg_cnt = 0; 02268 } 02269 return msg_cnt; 02270 } 02271 02272 tls_msg_t *tls_msg_get(uint8_t *dptr) 02273 { 02274 tls_msg.type = *dptr; 02275 dptr += 2; 02276 tls_msg.len = common_read_16_bit(dptr); 02277 dptr += 2; 02278 tls_msg.msg_ptr = dptr; 02279 return &tls_msg; 02280 } 02281 02282 tls_msg_t *tls_msg_ptr_get(void) 02283 { 02284 return &tls_msg; 02285 } 02286 02287 void tls_build_client_verify_payload(tls_heap_t *tls_heap) 02288 { 02289 uint8_t *ptr; 02290 ptr = tls_heap->hash_buf; 02291 ptr = common_write_32_bit(0x1400000c, ptr); 02292 memcpy(ptr, tls_heap->verify, 12); 02293 } 02294 02295 void tls_nonce_update(uint8_t *ptr) 02296 { 02297 uint8_t i = 8; 02298 ptr += 7; 02299 02300 while (i--) { 02301 if (*ptr == 0xff) { 02302 *ptr = 0; 02303 ptr--; 02304 } else { 02305 *ptr += 1; 02306 break; 02307 } 02308 } 02309 } 02310 #ifdef ECC 02311 uint8_t tls_parse_certificate_request(uint8_t *ptr, uint16_t len) 02312 { 02313 (void)len; 02314 uint16_t hash_alg; 02315 uint16_t count; 02316 uint8_t found = 0; 02317 count = *ptr++; 02318 02319 if (!count) { 02320 tr_debug("cert req 0 count 1"); 02321 return 0; 02322 } 02323 02324 while (count--) { 02325 02326 if (*ptr++ == TLS_CERT_TYPE_ECDSA) { 02327 02328 found = TLS_CERT_TYPE_ECDSA; 02329 02330 } 02331 02332 } 02333 02334 if (!found) { 02335 tr_debug("cert req no supported type"); 02336 return 0; 02337 } 02338 found = 0; 02339 02340 count = (uint16_t) * ptr++ << 8; 02341 count |= *ptr++; 02342 count >>= 1; 02343 02344 if (!count) { 02345 tr_debug("cert req 0 count 2"); 02346 return 0; 02347 } 02348 02349 02350 while (count--) { 02351 02352 hash_alg = common_read_16_bit(ptr); 02353 ptr += 2; 02354 if (hash_alg == TLS_SIG_HASH_ALG_SHA256_ECDSA) { 02355 found = 1; 02356 } 02357 02358 } 02359 02360 if (!found) { 02361 02362 tr_debug("cert req no supported Algo"); 02363 return 0; 02364 } 02365 02366 return 1; 02367 /* There is also names field but we do not have parser for it yet */ 02368 02369 } 02370 02371 02372 static uint8_t ecc_verify_calculate_hash(sec_suite_t *tls_suite) 02373 { 02374 tls_heap_t *theap = tls_suite->tls_session->tls_heap; 02375 if (!(tls_suite->setups & TLS_ECC_CERTIFICATE_RECEIVED)) { 02376 return 1; 02377 } else { 02378 tls_suite->setups &= ~TLS_ECC_CERTIFICATE_RECEIVED; 02379 } 02380 02381 if (tls_suite->setups & TLS_SERVER_MODE) { 02382 if (!(tls_suite->setups & TLS_ECC_CERTIFICATE_VERIFY)) { 02383 return 2; 02384 } else { 02385 tls_suite->setups &= ~TLS_ECC_CERTIFICATE_VERIFY; 02386 } 02387 } 02388 if (!theap->ecc_heap->sgnt) { 02389 return 3; 02390 } 02391 02392 tls_ecc_server_key_signature_hash(theap); 02393 return 0; 02394 02395 } 02396 02397 02398 void tls_ecc_reverse_hash(uint8_t *ptr) 02399 { 02400 uint8_t start = 0; 02401 uint8_t end = 31; 02402 uint8_t chr; 02403 while (start < end) { 02404 chr = ptr[start]; 02405 ptr[start] = ptr[end]; 02406 ptr[end] = chr; 02407 02408 start++; 02409 end--; 02410 } 02411 } 02412 02413 void tls_ecc_server_key_signature_hash(tls_heap_t *heap_ptr) 02414 { 02415 memset(heap_ptr->ecc_heap->sgnt->m_m.data, 0, MPINT_DATA_SIZE); 02416 ns_sha256_context ctx; 02417 ns_sha256_init(&ctx); 02418 ns_sha256_starts(&ctx); 02419 ns_sha256_update(&ctx, heap_ptr->tls_hello_random, 64); 02420 //ServerECDHParams(ECParameters+ECPoint) 02421 heap_ptr->hash_buf[0] = TLS_EC_CURVE_TYPE_NAMED_CURVE; 02422 common_write_16_bit(TLS_NAMED_CURVE_SECP256R1, heap_ptr->hash_buf + 1); 02423 heap_ptr->hash_buf[3] = 65; // ECPoint public - length indicator for following 512-bit public key? 02424 heap_ptr->hash_buf[4] = 4; 02425 ns_sha256_update(&ctx, heap_ptr->hash_buf, 5); 02426 ns_sha256_update(&ctx, heap_ptr->ecc_heap->server_public_key, 64); 02427 ns_sha256_finish(&ctx, heap_ptr->ecc_heap->sgnt->m_m.data); 02428 ns_sha256_free(&ctx); 02429 tls_ecc_reverse_hash((uint8_t *)heap_ptr->ecc_heap->sgnt->m_m.data); 02430 } 02431 02432 #endif 02433 02434 #else 02435 int8_t arm_tls_add_psk_key(const uint8_t *key_ptr, uint16_t key_id) { 02436 (void)key_ptr; 02437 (void)key_id; 02438 return -1; 02439 } 02440 #endif 02441 02442 02443
Generated on Fri Jul 22 2022 04:54:04 by
1.7.2
