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