Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp5040218rwb; Mon, 21 Nov 2022 15:49:38 -0800 (PST) X-Google-Smtp-Source: AA0mqf6XtlnB7xlZAgEi5QpJ/XN8ih9TVmWethS0VA1HB2t/VB2SNF7bAY9xpC5glXHpAxHg5Xl8 X-Received: by 2002:a17:903:2683:b0:186:6f1e:5087 with SMTP id jf3-20020a170903268300b001866f1e5087mr1249963plb.119.1669074577790; Mon, 21 Nov 2022 15:49:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669074577; cv=none; d=google.com; s=arc-20160816; b=MsOub5map6zaPBQepZjcT8FIKnl7e8hzGDLOD3BMx2Yb0Ia8gfXjdQItNIWA/HYFpl Weah+XzOqak1GK6aganftXhM9Jzm55wobAbfmHf2505YiuaX6sLuFnazpZCHxTV9rAED klNRhxKOvAoaES73UHmBbtu8pyZKGRyR48o7o5Z8VAZnyLAiU7N5NgbaauN7QExOzqE3 z71Jo7hiGM8PBpwnomxQq2mSTmBjOhedtuMXXTD1gee61PEl6SJZKC4yL6/jR+DUfjXp ho66/C3O0heo2b/YkE/jWHl5Pi7PwO8aPlZfx3zHRtw8Wy/xYdfLOpd0+E54HZy6a7ix c1Yg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=tggtdN2H+Ljb6mx+yHMHlWXIh9Gz3q+Ptm/DTLDsclw=; b=fYFKfXy3gaDN+BSS9Uoa2touwW8gMMdOVG7LQjf4tYzpu8ZAIHf6csGVo8wXjrN1q7 jh/gKEuczAMi29ESYplmlkgWJ6QZWV/K7lp054Pjq9KlBX5DEMEBZFSmEQffjtW6CeDs XuRYplwZwveovAY+wt/Yn5+g064ePWC2UKr0T4NeuCcfD+wLXaqi3kSYTNBkGery8acX sw1NDCKeDPjdHWSXeF1Y56XcKJGZglOk8QDZ9f7+c2CjQYYbYCgYK58ycl5svTa4eDTi FYKtKVP0DksQRUFlwXbLIZcaFjkjC4esB3q75tmCt+EuX8DgjSNQdGt/oKTv6tS7U+Ua ME7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=j8n5PcXl; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d4-20020a056a0010c400b0056590cd0969si12848888pfu.208.2022.11.21.15.49.24; Mon, 21 Nov 2022 15:49:37 -0800 (PST) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=j8n5PcXl; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232137AbiKUXq5 (ORCPT + 99 others); Mon, 21 Nov 2022 18:46:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53428 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231953AbiKUXqU (ORCPT ); Mon, 21 Nov 2022 18:46:20 -0500 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E74A1CF9 for ; Mon, 21 Nov 2022 15:44:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1669074289; x=1700610289; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=hlRyjRXk/Mf8iKNdbIXvoPgMyfu1rQ99CWmCVV5h0AE=; b=j8n5PcXlfAUaTH731qI8TNyvZb+Hyfs9Pz1uBAXqCG7cI2FtgC+VwCBL gYDjPkpHoGkEvdBGZ0IH1Pf+p6yjpTrngK8eseVHQv5bpluzAgBqzg5nI 8l0EGhxaPa4Vr1+PZaHP47ZRG2JlJgBoqFl9whlJ3WVyPSDO016VOA8ge BmQy6Vb04CZMY7P5zzkwS1/0BD/RcSD3UcYy4tq70D7+g5Ce97tchYkww jNiE9061g22OI37ryUKqNX+fxZZkMspbJ2y+/f5mrNx/FjsGPPs+ReHJq jeVrEXdtYNyNZizrEdJI/VKcsaX/kvt8o1H+bDSgaBNpYK9koWnBnGM3P w==; X-IronPort-AV: E=McAfee;i="6500,9779,10538"; a="377946614" X-IronPort-AV: E=Sophos;i="5.96,182,1665471600"; d="scan'208";a="377946614" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Nov 2022 15:44:49 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10538"; a="783633473" X-IronPort-AV: E=Sophos;i="5.96,182,1665471600"; d="scan'208";a="783633473" Received: from intel-latitude-e5450.iind.intel.com ([10.224.186.32]) by fmsmga001.fm.intel.com with ESMTP; 21 Nov 2022 15:44:48 -0800 From: Sathish Narasimman To: linux-bluetooth@vger.kernel.org Cc: Sathish Narasimman Subject: [PATCH BlueZ 6/6] tools: Add support to generate RSI using SIRK Date: Tue, 22 Nov 2022 05:16:24 +0530 Message-Id: <20221121234624.2961-7-sathish.narasimman@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221121234624.2961-1-sathish.narasimman@intel.com> References: <20221121234624.2961-1-sathish.narasimman@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org The patch helps to generate Resolvable set identifier adv data. which can be used as ADV data during advertisement. It will be used to identify the device as part of setmember for Coordinated set identification profile. Example: $advtest -i "761FAE703ED681F0C50B34155B6434FB" SIRK: 761FAE703ED681F0C50B34155B6434FB RSI: 0x71 0xcb 0xbc 0x7e 0x01 0x84 Random: bccb71 Hash: 84017e --- tools/advtest.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/tools/advtest.c b/tools/advtest.c index de036e783325..1ac9dd9e1226 100644 --- a/tools/advtest.c +++ b/tools/advtest.c @@ -13,6 +13,13 @@ #include #endif +#include + +#include +#include +#include +#include + #include #include "lib/bluetooth.h" @@ -32,6 +39,9 @@ "\xe1\x23\x99\xc1\xca\x9a\xc3\x31" #define SCAN_IRK "\xfa\x73\x09\x11\x3f\x03\x37\x0f" \ "\xf4\xf9\x93\x1e\xf9\xa3\x63\xa6" +#ifndef MIN +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#endif static struct mgmt *mgmt; static uint16_t index1 = MGMT_INDEX_NONE; @@ -43,13 +53,73 @@ static struct bt_hci *scan_dev; static void print_rpa(const uint8_t addr[6]) { - printf(" Address: %02x:%02x:%02x:%02x:%02x:%02x\n", + printf(" RSI:\t0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]); printf(" Random: %02x%02x%02x\n", addr[3], addr[4], addr[5]); printf(" Hash: %02x%02x%02x\n", addr[0], addr[1], addr[2]); } +static size_t hex2bin(const char *hexstr, uint8_t *buf, size_t buflen) +{ + size_t i, len; + + len = MIN((strlen(hexstr) / 2), buflen); + memset(buf, 0, len); + + for (i = 0; i < len; i++) + if (sscanf(hexstr + (i * 2), "%02hhX", &buf[i]) != 1) + continue; + + + return len; +} + +static bool get_random_bytes(void *buf, size_t num_bytes) +{ + ssize_t len; + int fd; + + fd = open("/dev/urandom", O_RDONLY); + if (fd < 0) + return false; + + len = read(fd, buf, num_bytes); + + close(fd); + + if (len < 0) + return false; + + return true; +} + +static void generate_rsi(char *val) +{ + uint8_t sirk[16], hash[3]; + uint8_t rsi[6]; + + hex2bin(val, sirk, sizeof(sirk)); + + get_random_bytes(&rsi[3], 3); + + rsi[5] &= 0x3f; /* Clear 2 msb */ + rsi[5] |= 0x40; /* Set 2nd msb */ + + crypto = bt_crypto_new(); + if (!crypto) { + fprintf(stderr, "Failed to open crypto interface\n"); + mainloop_exit_failure(); + return; + } + + bt_crypto_ah(crypto, sirk, rsi + 3, hash); + memcpy(rsi, hash, 3); + + print_rpa(rsi); +} + + static void scan_le_adv_report(const void *data, uint8_t size, void *user_data) { @@ -351,9 +421,11 @@ static void usage(void) printf("\tadvtest [options]\n"); printf("options:\n" "\t-h, --help Show help options\n"); + printf(" \t-i <128bit SIRK>, Generate RSI ADV Data\n"); } static const struct option main_options[] = { + { "hash", no_argument, NULL, 'i' }, { "version", no_argument, NULL, 'v' }, { "help", no_argument, NULL, 'h' }, { } @@ -366,11 +438,15 @@ int main(int argc ,char *argv[]) for (;;) { int opt; - opt = getopt_long(argc, argv, "vh", main_options, NULL); + opt = getopt_long(argc, argv, "i:vh", main_options, NULL); if (opt < 0) break; switch (opt) { + case 'i': + printf("SIRK: %s\n", optarg); + generate_rsi(optarg); + return EXIT_SUCCESS; case 'v': printf("%s\n", VERSION); return EXIT_SUCCESS; -- 2.25.1