mirror of
https://github.com/google/pebble.git
synced 2025-03-25 12:59:07 +00:00
120 lines
3.6 KiB
C
120 lines
3.6 KiB
C
/*
|
|
* Copyright 2024 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "fake_bluetooth_persistent_storage.h"
|
|
|
|
#include "util/list.h"
|
|
|
|
#include <btutil/bt_device.h>
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
typedef struct {
|
|
ListNode node;
|
|
BTBondingID id;
|
|
SMIdentityResolvingKey irk;
|
|
bool is_public_address;
|
|
BTDeviceInternal device;
|
|
char name[BT_DEVICE_NAME_BUFFER_SIZE];
|
|
bool is_gateway;
|
|
} FakeBonding;
|
|
|
|
static FakeBonding *s_head;
|
|
static BTBondingID s_next_id = 1;
|
|
|
|
bool bt_persistent_storage_is_gateway(const BTBondingID bonding) {
|
|
return true;
|
|
}
|
|
|
|
static BTBondingID prv_next_id(void) {
|
|
return s_next_id++;
|
|
}
|
|
|
|
static bool prv_find_by_id(ListNode *found_node, void *data) {
|
|
BTBondingID bonding_id = (BTBondingID) data;
|
|
const FakeBonding *bonding = (const FakeBonding *) found_node;
|
|
return (bonding->id == bonding_id);
|
|
}
|
|
|
|
bool bt_persistent_storage_get_ble_pairing_by_id(BTBondingID id,
|
|
SMIdentityResolvingKey *IRK_out,
|
|
BTDeviceInternal *device_out,
|
|
char name[BT_DEVICE_NAME_BUFFER_SIZE]) {
|
|
FakeBonding *bonding = (FakeBonding *) list_find(&s_head->node, prv_find_by_id,
|
|
(void *) (uintptr_t) id);
|
|
if (!bonding) {
|
|
return false;
|
|
}
|
|
if (IRK_out) {
|
|
*IRK_out = bonding->irk;
|
|
}
|
|
if (device_out) {
|
|
*device_out = bonding->device;
|
|
}
|
|
if (name) {
|
|
strncpy(name, bonding->name, BT_DEVICE_NAME_BUFFER_SIZE);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
BTBondingID fake_bt_persistent_storage_add(const SMIdentityResolvingKey *irk,
|
|
const BTDeviceInternal *device,
|
|
const char name[BT_DEVICE_NAME_BUFFER_SIZE],
|
|
bool is_gateway) {
|
|
FakeBonding *bonding = (FakeBonding *) malloc(sizeof(FakeBonding));
|
|
*bonding = (const FakeBonding) {
|
|
.id = prv_next_id(),
|
|
.irk = *irk,
|
|
.device = *device,
|
|
.is_gateway = is_gateway,
|
|
};
|
|
strncpy(bonding->name, name, BT_DEVICE_NAME_BUFFER_SIZE);
|
|
s_head = (FakeBonding *) list_prepend(&s_head->node, &bonding->node);
|
|
|
|
return bonding->id;
|
|
}
|
|
|
|
BTBondingID bt_persistent_storage_store_ble_pairing(const SMPairingInfo *pairing_info, bool is_gateway,
|
|
const char *device_name, bool requires_address_pinning, uint8_t flags) {
|
|
const SMIdentityResolvingKey *IRK = pairing_info->is_remote_identity_info_valid ?
|
|
&pairing_info->irk : NULL;
|
|
const BTDeviceInternal *device = pairing_info->is_remote_identity_info_valid ?
|
|
&pairing_info->identity : NULL;
|
|
if (!device_name) {
|
|
device_name = "Device";
|
|
}
|
|
return fake_bt_persistent_storage_add(IRK, device, device_name, is_gateway);
|
|
}
|
|
|
|
void fake_bt_persistent_storage_reset(void) {
|
|
FakeBonding *bonding = s_head;
|
|
while (bonding) {
|
|
FakeBonding *next = (FakeBonding *) bonding->node.next;
|
|
free(bonding);
|
|
bonding = next;
|
|
}
|
|
s_head = NULL;
|
|
s_next_id = 1;
|
|
}
|
|
|
|
bool bt_persistent_storage_get_root_key(SMRootKeyType key_type, SM128BitKey *key_out) {
|
|
return true;
|
|
}
|
|
|
|
void bt_persistent_storage_set_root_keys(SM128BitKey *keys_in) {
|
|
return;
|
|
}
|