12ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He/****************************************************************************** 22ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * 35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski * Copyright 2016 The Android Open Source Project 42ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * 52ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * Licensed under the Apache License, Version 2.0 (the "License"); 62ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * you may not use this file except in compliance with the License. 72ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * You may obtain a copy of the License at: 82ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * 92ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * http://www.apache.org/licenses/LICENSE-2.0 102ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * 112ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * Unless required by applicable law or agreed to in writing, software 122ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * distributed under the License is distributed on an "AS IS" BASIS, 132ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * See the License for the specific language governing permissions and 152ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * limitations under the License. 162ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * 172ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He ******************************************************************************/ 182ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He#include <stdarg.h> 192ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 202ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He#include <gmock/gmock.h> 212ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He#include <gtest/gtest.h> 222ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 232ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He#include "bt_trace.h" 242ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He#include "hcidefs.h" 252ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He#include "stack/include/smp_api.h" 269181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach#include "stack/smp/p_256_ecc_pp.h" 272ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He#include "stack/smp/smp_int.h" 282ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 292ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He/* 302ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * This test verifies various key distribution methods in SMP works using the 312ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * following parameter set: 322ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * 332ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * When testing target as Master (Initiator is local, Responder is remote) 342ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * 352ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * Initiator's Pairing Request: 0x070710000001(01) 362ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * Responder's Pairing Response: 0x050008000003(02) 372ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * Initiator's Bluetooth Address: 0xA1A2A3A4A5A6 382ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * Initiator's Bluetooth Address Type: 0x01 392ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * Responder's Bluetooth Address: 0xB1B2B3B4B5B6 402ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * Responder's Bluetooth Address Type: 0x00 412ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * Initiator's Random Number: 0x5783D52156AD6F0E6388274EC6702EE0 422ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * TK Encryption Key: 0x0 432ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * 442ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * Correct values: 452ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * 462ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * p1: 0x05000800000302070710000001010001 472ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * p1 XOR r: 0x5283dd2156ae6d096498274ec7712ee1 482ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * p1 prime: 0x02c7aa2a9857ac866ff91232df0e3c95 492ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * p2: 0x00000000a1a2a3a4a5a6b1b2b3b4b5b6 502ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * MConfirm (c1): 0x1e1e3fef878988ead2a74dc5bef13b86 512ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * 522ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * NOTE: All these values are presented in mathematical reasonable canonical 532ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * form that has MSB on the left and LSB on the right. In Bluetooth packets, 542ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * they are mostly reversed to be Little Endian which have LSB on the left and 552ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He * MSB on the right. 562ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He */ 572ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 582ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He// Set remote bda to 0xB1B2B3B4B5B6 59a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_ReadRemoteConnectionAddr(const RawAddress& pseudo_addr, 60a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski RawAddress& conn_addr, 612ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tBLE_ADDR_TYPE* p_addr_type) { 62b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski conn_addr = RawAddress({0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6}); 632ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He *p_addr_type = 0x00; 642ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He return true; 652ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 662ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 672ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He// Set local_bda to 0xA1A2A3A4A5A6 68a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_ReadConnectionAddr(const RawAddress& remote_bda, 69a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski RawAddress& local_conn_addr, 702ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tBLE_ADDR_TYPE* p_addr_type) { 71b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski local_conn_addr = RawAddress({0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6}); 722ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He *p_addr_type = 0x01; 732ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 742ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 752ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He// Require bte_logmsg.cc to run, here is just to fake it as we don't care about 762ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He// trace in unit test 772ec87467b3185fb60e76f243e6b4ea05149a06c1Jack Hevoid LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...) { 782ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He va_list args; 792ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He va_start(args, fmt_str); 802ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He vprintf(fmt_str, args); 812ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He va_end(args); 822ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 832ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 842ec87467b3185fb60e76f243e6b4ea05149a06c1Jack Heextern void smp_gen_p1_4_confirm(tSMP_CB* p_cb, 852ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tBLE_ADDR_TYPE remote_bd_addr_type, 862ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He BT_OCTET16 p1); 872ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 88a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskiextern void smp_gen_p2_4_confirm(tSMP_CB* p_cb, const RawAddress& remote_bda, 892ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He BT_OCTET16 p2); 902ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 912ec87467b3185fb60e76f243e6b4ea05149a06c1Jack Heextern tSMP_STATUS smp_calculate_comfirm(tSMP_CB* p_cb, BT_OCTET16 rand, 922ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tSMP_ENC* output); 932ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 942ec87467b3185fb60e76f243e6b4ea05149a06c1Jack Henamespace testing { 952ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 962ec87467b3185fb60e76f243e6b4ea05149a06c1Jack Hevoid dump_uint128(BT_OCTET16 a, char* buffer) { 972ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He for (unsigned int i = 0; i < sizeof(BT_OCTET16); ++i) { 982ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He snprintf(buffer, 3, "%02x", a[i]); 992ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He buffer += 2; 1002ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He } 1012ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He *buffer = '\0'; 1022ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 1032ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 1042ec87467b3185fb60e76f243e6b4ea05149a06c1Jack Hevoid dump_uint128_reverse(BT_OCTET16 a, char* buffer) { 1052ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He for (int i = (int)(sizeof(BT_OCTET16) - 1); i >= 0; --i) { 1062ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He snprintf(buffer, 3, "%02x", a[i]); 1072ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He buffer += 2; 1082ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He } 1092ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He *buffer = '\0'; 1102ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 1112ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 1122ec87467b3185fb60e76f243e6b4ea05149a06c1Jack Hevoid print_uint128(BT_OCTET16 a) { 1132ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He for (unsigned int i = 0; i < sizeof(BT_OCTET16); ++i) { 1142ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He printf("%02x", a[i]); 1152ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He } 1162ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He printf("\n"); 1172ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 1182ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 1192ec87467b3185fb60e76f243e6b4ea05149a06c1Jack Hevoid parse_uint128(const char* input, BT_OCTET16 output) { 1202ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He memset(output, 0, sizeof(BT_OCTET16)); 1212ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He for (unsigned int count = 0; count < sizeof(BT_OCTET16); count++) { 1222ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He sscanf(input, "%2hhx", &output[count]); 1232ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He input += 2; 1242ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He } 1252ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 1262ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 1272ec87467b3185fb60e76f243e6b4ea05149a06c1Jack Hevoid reverse_array_inplace(BT_OCTET16 a) { 1282ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He uint8_t tmp; 1292ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He uint8_t* a_end = a + sizeof(BT_OCTET16) - 1; 1302ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He while (a_end > a) { 1312ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tmp = *a_end; 1322ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He *a_end = *a; 1332ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He *a = tmp; 1342ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He ++a; 1352ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He --a_end; 1362ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He } 1372ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 1382ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 1392ec87467b3185fb60e76f243e6b4ea05149a06c1Jack Heclass SmpCalculateConfirmTest : public Test { 1402ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He protected: 1412ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tSMP_CB p_cb_; 1422ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He // Set random to 0x5783D52156AD6F0E6388274EC6702EE0 1432ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He BT_OCTET16 rand_ = {0x57, 0x83, 0xD5, 0x21, 0x56, 0xAD, 0x6F, 0x0E, 1442ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 0x63, 0x88, 0x27, 0x4E, 0xC6, 0x70, 0x2E, 0xE0}; 1452ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 1462ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He void SetUp() { 1472ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He memset(p_cb_.tk, 0, sizeof(p_cb_.tk)); 1482ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He // Set pairing request packet to 0x070710000001(01) 1492ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.local_io_capability = 0x01; 1502ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.loc_oob_flag = 0x00; 1512ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.loc_auth_req = 0x00; 1522ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.loc_enc_size = 0x10; 1532ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.local_i_key = 0x07; 1542ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.local_r_key = 0x07; 1552ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He // Set pairing response packet to 0x050008000003(02) 1562ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.peer_io_caps = 0x03; 1572ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.peer_oob_flag = 0x00; 1582ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.peer_auth_req = 0x00; 1592ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.peer_enc_size = 0x08; 1602ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.peer_i_key = 0x00; 1612ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.peer_r_key = 0x05; 1622ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He // Set role to master 1632ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He p_cb_.role = HCI_ROLE_MASTER; 1642ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He reverse_array_inplace(rand_); 1652ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He } 1662ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He void TearDown() {} 1672ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 1682ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He public: 1692ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He}; 1702ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 1712ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He// Test smp_gen_p2_4_confirm function implementation 1722ec87467b3185fb60e76f243e6b4ea05149a06c1Jack HeTEST_F(SmpCalculateConfirmTest, test_smp_gen_p2_4_confirm_as_master) { 1732ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He BT_OCTET16 p2; 174a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski RawAddress remote_bda; 1752ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tBLE_ADDR_TYPE remote_bd_addr_type = 0; 1762ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He BTM_ReadRemoteConnectionAddr(p_cb_.pairing_bda, remote_bda, 1772ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He &remote_bd_addr_type); 1782ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He BTM_ReadConnectionAddr(p_cb_.pairing_bda, p_cb_.local_bda, &p_cb_.addr_type); 1792ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He smp_gen_p2_4_confirm(&p_cb_, remote_bda, p2); 1802ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He // Correct p2 is 0x00000000a1a2a3a4a5a6b1b2b3b4b5b6 1812ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He const char expected_p2_str[] = "00000000a1a2a3a4a5a6b1b2b3b4b5b6"; 1822ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He char p2_str[2 * sizeof(BT_OCTET16) + 1]; 1832ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He dump_uint128_reverse(p2, p2_str); 1842ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He ASSERT_THAT(p2_str, StrEq(expected_p2_str)); 1852ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 1862ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 1872ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He// Test smp_gen_p1_4_confirm and SMP_Encrypt function implementation 1882ec87467b3185fb60e76f243e6b4ea05149a06c1Jack HeTEST_F(SmpCalculateConfirmTest, test_SMP_Encrypt_as_master) { 1892ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He BT_OCTET16 p1; 190a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski RawAddress remote_bda; 1912ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tBLE_ADDR_TYPE remote_bd_addr_type = 0; 1922ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He BTM_ReadRemoteConnectionAddr(p_cb_.pairing_bda, remote_bda, 1932ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He &remote_bd_addr_type); 1942ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He BTM_ReadConnectionAddr(p_cb_.pairing_bda, p_cb_.local_bda, &p_cb_.addr_type); 1952ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He smp_gen_p1_4_confirm(&p_cb_, remote_bd_addr_type, p1); 1962ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He // Correct p1 is 0x05000800000302070710000001010001 1972ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He const char expected_p1_str[] = "05000800000302070710000001010001"; 1982ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He char p1_str[2 * sizeof(BT_OCTET16) + 1]; 1992ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He dump_uint128_reverse(p1, p1_str); 2002ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He ASSERT_THAT(p1_str, StrEq(expected_p1_str)); 2012ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He smp_xor_128(p1, rand_); 2022ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He // Correct p1 xor r is 0x5283dd2156ae6d096498274ec7712ee1 2032ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He const char expected_p1_xor_r_str[] = "5283dd2156ae6d096498274ec7712ee1"; 2042ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He char p1_xor_r_str[2 * sizeof(BT_OCTET16) + 1]; 2052ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He dump_uint128_reverse(p1, p1_xor_r_str); 2062ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He ASSERT_THAT(p1_xor_r_str, StrEq(expected_p1_xor_r_str)); 2072ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tSMP_ENC output; 2082ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He memset(&output, 0, sizeof(tSMP_ENC)); 2092ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He ASSERT_TRUE( 2102ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He SMP_Encrypt(p_cb_.tk, BT_OCTET16_LEN, p1, BT_OCTET16_LEN, &output)); 2112ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He const char expected_p1_prime_str[] = "02c7aa2a9857ac866ff91232df0e3c95"; 2122ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He char p1_prime_str[2 * sizeof(BT_OCTET16) + 1]; 2132ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He dump_uint128_reverse(output.param_buf, p1_prime_str); 2142ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He ASSERT_THAT(p1_prime_str, StrEq(expected_p1_prime_str)); 2152ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 2162ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He 2172ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He// Test smp_calculate_comfirm function implementation 2182ec87467b3185fb60e76f243e6b4ea05149a06c1Jack HeTEST_F(SmpCalculateConfirmTest, test_smp_calculate_comfirm_as_master) { 2192ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tSMP_ENC output; 2202ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He tSMP_STATUS status = smp_calculate_comfirm(&p_cb_, rand_, &output); 2212ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He EXPECT_EQ(status, SMP_SUCCESS); 2222ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He // Correct MConfirm is 0x1e1e3fef878988ead2a74dc5bef13b86 2232ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He const char expected_confirm_str[] = "1e1e3fef878988ead2a74dc5bef13b86"; 2242ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He char confirm_str[2 * sizeof(BT_OCTET16) + 1]; 2252ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He dump_uint128_reverse(output.param_buf, confirm_str); 2262ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He ASSERT_THAT(confirm_str, StrEq(expected_confirm_str)); 2272ec87467b3185fb60e76f243e6b4ea05149a06c1Jack He} 2289181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2299181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach// Test ECC point validation 2309181ec28da94705a763edbe60bd2a87e5f882bebAndre EisenbachTEST(SmpEccValidationTest, test_valid_points) { 2319181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach Point p; 2329181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2339181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach // Test data from Bluetooth Core Specification 2349181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach // Version 5.0 | Vol 2, Part G | 7.1.2 2359181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2369181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach // Sample 1 2379181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[7] = 0x20b003d2; 2389181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[6] = 0xf297be2c; 2399181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[5] = 0x5e2c83a7; 2409181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[4] = 0xe9f9a5b9; 2419181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[3] = 0xeff49111; 2429181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[2] = 0xacf4fddb; 2439181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[1] = 0xcc030148; 2449181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[0] = 0x0e359de6; 2459181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2469181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[7] = 0xdc809c49; 2479181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[6] = 0x652aeb6d; 2489181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[5] = 0x63329abf; 2499181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[4] = 0x5a52155c; 2509181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[3] = 0x766345c2; 2519181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[2] = 0x8fed3024; 2529181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[1] = 0x741c8ed0; 2539181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[0] = 0x1589d28b; 2549181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2559181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach EXPECT_TRUE(ECC_ValidatePoint(p)); 2569181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2579181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach // Sample 2 2589181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[7] = 0x2c31a47b; 2599181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[6] = 0x5779809e; 2609181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[5] = 0xf44cb5ea; 2619181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[4] = 0xaf5c3e43; 2629181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[3] = 0xd5f8faad; 2639181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[2] = 0x4a8794cb; 2649181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[1] = 0x987e9b03; 2659181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[0] = 0x745c78dd; 2669181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2679181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[7] = 0x91951218; 2689181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[6] = 0x3898dfbe; 2699181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[5] = 0xcd52e240; 2709181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[4] = 0x8e43871f; 2719181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[3] = 0xd0211091; 2729181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[2] = 0x17bd3ed4; 2739181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[1] = 0xeaf84377; 2749181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[0] = 0x43715d4f; 2759181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2769181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach EXPECT_TRUE(ECC_ValidatePoint(p)); 2779181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach} 2789181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2799181ec28da94705a763edbe60bd2a87e5f882bebAndre EisenbachTEST(SmpEccValidationTest, test_invalid_points) { 2809181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach Point p; 2819181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach multiprecision_init(p.x, 8); 2829181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach multiprecision_init(p.y, 8); 2839181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2849181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach EXPECT_FALSE(ECC_ValidatePoint(p)); 2859181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2869181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach // Sample 1 2879181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[7] = 0x20b003d2; 2889181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[6] = 0xf297be2c; 2899181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[5] = 0x5e2c83a7; 2909181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[4] = 0xe9f9a5b9; 2919181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[3] = 0xeff49111; 2929181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[2] = 0xacf4fddb; 2939181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[1] = 0xcc030148; 2949181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.x[0] = 0x0e359de6; 2959181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2969181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach EXPECT_FALSE(ECC_ValidatePoint(p)); 2979181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 2989181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[7] = 0xdc809c49; 2999181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[6] = 0x652aeb6d; 3009181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[5] = 0x63329abf; 3019181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[4] = 0x5a52155c; 3029181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[3] = 0x766345c2; 3039181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[2] = 0x8fed3024; 3049181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[1] = 0x741c8ed0; 3059181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[0] = 0x1589d28b; 3069181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 3079181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach p.y[0]--; 3089181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach 3099181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach EXPECT_FALSE(ECC_ValidatePoint(p)); 3109181ec28da94705a763edbe60bd2a87e5f882bebAndre Eisenbach} 311c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski} // namespace testing 312