| // 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); |