blob: 68b16c387eecf7a499be1e7bcb6f4bcaf6276554 [file] [log] [blame]
// Copyright 2022 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.
//! V1 advertisement support.
use crate::extended::de_type::DeType;
use crate::DeLengthOutOfRange;
use array_view::ArrayView;
pub mod data_elements;
pub mod de_type;
pub mod deserialize;
pub mod section_signature_payload;
pub mod serialize;
/// Maximum size of an NP advertisement, including the adv header
pub const BLE_ADV_SVC_CONTENT_LEN: usize = 254
// length and type bytes for svc data TLV
- 1 - 1
// NP UUID
- 2;
/// Maximum number of sections in an advertisement
pub const NP_V1_ADV_MAX_ENCRYPTED_SECTION_COUNT: usize = 8;
/// Maximum number of public sections in an advertisement
pub const NP_V1_ADV_MAX_PUBLIC_SECTION_COUNT: usize = 1;
/// Maximum size of a NP section, including its header byte
pub const NP_ADV_MAX_SECTION_LEN: usize = BLE_ADV_SVC_CONTENT_LEN
// adv header byte
- 1;
/// Max V1 DE length (7 bit length field).
pub(crate) const MAX_DE_LEN: usize = 127;
const METADATA_KEY_LEN: usize = 16;
/// Length of a DE's content -- must be in `[0, 127]`
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct DeLength {
len: u8,
}
impl DeLength {
/// A convenient constant for zero length.
pub const ZERO: DeLength = DeLength { len: 0 };
fn as_u8(&self) -> u8 {
self.len
}
}
impl TryFrom<u8> for DeLength {
type Error = DeLengthOutOfRange;
fn try_from(value: u8) -> Result<Self, Self::Error> {
if usize::from(value) <= MAX_DE_LEN {
Ok(Self { len: value })
} else {
Err(DeLengthOutOfRange {})
}
}
}
impl TryFrom<usize> for DeLength {
type Error = DeLengthOutOfRange;
fn try_from(value: usize) -> Result<Self, Self::Error> {
value.try_into().map_err(|_e| DeLengthOutOfRange).and_then(|num: u8| num.try_into())
}
}
/// Convert a tinyvec into an equivalent ArrayView
fn to_array_view<T, const N: usize>(vec: tinyvec::ArrayVec<[T; N]>) -> ArrayView<T, N>
where
[T; N]: tinyvec::Array,
{
let len = vec.len();
ArrayView::try_from_array(vec.into_inner(), len).expect("len is from original vec")
}
pub(crate) const ENCRYPTION_INFO_DE_TYPE: DeType = DeType::const_from(0x10);