use crate::AddressType;
use enumflags2::BitFlags;
use super::interact::{address_bytes, get_address};
use super::*;
use crate::util::BufExt;
pub async fn read_local_oob_data(
socket: &mut ManagementStream,
controller: Controller,
event_tx: Option<mpsc::Sender<Response>>,
) -> Result<OutOfBandData> {
let (_, param) = exec_command(
socket,
Command::ReadLocalOutOfBand,
controller,
None,
event_tx,
)
.await?;
let mut param = param.ok_or(Error::NoData)?;
Ok(OutOfBandData {
hash_192: param.get_array_u8(),
randomizer_192: param.get_array_u8(),
hash_256: if param.has_remaining() {
Some(param.get_array_u8())
} else {
None
},
randomizer_256: if param.has_remaining() {
Some(param.get_array_u8())
} else {
None
},
})
}
pub async fn read_local_oob_ext_data(
socket: &mut ManagementStream,
controller: Controller,
address_types: BitFlags<AddressTypeFlag>,
event_tx: Option<mpsc::Sender<Response>>,
) -> Result<(BitFlags<AddressTypeFlag>, Bytes)> {
let (_, param) = exec_command(
socket,
Command::ReadLocalOutOfBandExtended,
controller,
Some(Bytes::copy_from_slice(&[address_types.bits() as u8])),
event_tx,
)
.await?;
let mut param = param.ok_or(Error::NoData)?;
Ok((
param.get_flags_u8(),
{
let eir_data_len = param.get_u16_le();
param.split_to(eir_data_len as usize)
},
))
}
pub async fn add_remote_oob_data(
socket: &mut ManagementStream,
controller: Controller,
address: Address,
address_type: AddressType,
data: OutOfBandData,
event_tx: Option<mpsc::Sender<Response>>,
) -> Result<(Address, AddressType)> {
let mut param = BytesMut::with_capacity(39);
param.put_slice(address.as_ref());
param.put_u8(address_type as u8);
param.put_slice(&data.hash_192[..]);
param.put_slice(&data.randomizer_192[..]);
if let Some(hash_256) = data.hash_256 {
param.put_slice(&hash_256[..]);
}
if let Some(randomizer_256) = data.randomizer_256 {
param.put_slice(&randomizer_256[..]);
}
let (_, param) = exec_command(
socket,
Command::AddRemoteOutOfBand,
controller,
Some(param.freeze()),
event_tx,
)
.await?;
get_address(param)
}
pub async fn remove_remote_oob_data(
socket: &mut ManagementStream,
controller: Controller,
address: Address,
address_type: AddressType,
event_tx: Option<mpsc::Sender<Response>>,
) -> Result<(Address, AddressType)> {
let (_, param) = exec_command(
socket,
Command::RemoveRemoteOutOfBand,
controller,
Some(address_bytes(address, address_type)),
event_tx,
)
.await?;
get_address(param)
}
#[derive(Debug)]
pub struct OutOfBandData {
pub hash_192: [u8; 16],
pub randomizer_192: [u8; 16],
pub hash_256: Option<[u8; 16]>,
pub randomizer_256: Option<[u8; 16]>,
}