| // 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. | 
 |  | 
 | //! V0 advertisement support. | 
 |  | 
 | use crate::MetadataKey; | 
 | use core::fmt; | 
 | use crypto_provider::CryptoProvider; | 
 | use ldt_np_adv::NP_LEGACY_METADATA_KEY_LEN; | 
 |  | 
 | pub mod actions; | 
 | pub mod data_elements; | 
 | pub mod de_type; | 
 | pub mod deserialize; | 
 | pub mod serialize; | 
 |  | 
 | #[cfg(test)] | 
 | mod random_data_elements; | 
 |  | 
 | /// Advertisement capacity after 5 bytes of BLE header and 2 bytes of svc UUID are reserved from a | 
 | /// 31-byte advertisement | 
 | pub const BLE_ADV_SVC_CONTENT_LEN: usize = 24; | 
 | /// Maximum possible DE content: packet size minus 2 for adv header & DE header | 
 | const NP_MAX_DE_CONTENT_LEN: usize = BLE_ADV_SVC_CONTENT_LEN - 2; | 
 |  | 
 | /// "Short" 14-byte metadata key type employed for V0, which needs to be | 
 | /// expanded to a regular-size 16-byte metadata key to decrypt metadata. | 
 | #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] | 
 | pub struct ShortMetadataKey(pub [u8; NP_LEGACY_METADATA_KEY_LEN]); | 
 |  | 
 | impl AsRef<[u8]> for ShortMetadataKey { | 
 |     fn as_ref(&self) -> &[u8] { | 
 |         &self.0 | 
 |     } | 
 | } | 
 |  | 
 | impl ShortMetadataKey { | 
 |     /// Expand this short 14-byte metadata key to a 16-byte metadata key | 
 |     /// which may be used to decrypt metadata. | 
 |     pub fn expand<C: CryptoProvider>(&self) -> MetadataKey { | 
 |         let expanded_bytes = np_hkdf::legacy_metadata_expanded_key::<C>(&self.0); | 
 |         MetadataKey(expanded_bytes) | 
 |     } | 
 | } | 
 |  | 
 | /// Marker type to allow disambiguating between plaintext and encrypted packets at compile time. | 
 | /// | 
 | /// See also [PacketFlavorEnum] for when runtime flavor checks are more suitable. | 
 | pub trait PacketFlavor: fmt::Debug + Clone + Copy { | 
 |     /// The corresponding [PacketFlavorEnum] variant. | 
 |     const ENUM_VARIANT: PacketFlavorEnum; | 
 | } | 
 |  | 
 | /// Marker type for plaintext packets (public identity and no identity). | 
 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] | 
 | pub struct Plaintext; | 
 |  | 
 | impl PacketFlavor for Plaintext { | 
 |     const ENUM_VARIANT: PacketFlavorEnum = PacketFlavorEnum::Plaintext; | 
 | } | 
 |  | 
 | /// Marker type for ciphertext packets (private, trusted, and provisioned identity). | 
 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] | 
 | pub struct Ciphertext; | 
 |  | 
 | impl PacketFlavor for Ciphertext { | 
 |     const ENUM_VARIANT: PacketFlavorEnum = PacketFlavorEnum::Ciphertext; | 
 | } | 
 |  | 
 | /// An enum version of the implementors of [PacketFlavor] for use cases where runtime checking is | 
 | /// a better fit than compile time checking. | 
 | #[derive(Debug, Clone, Copy, strum_macros::EnumIter, PartialEq, Eq)] | 
 | pub enum PacketFlavorEnum { | 
 |     /// Corresponds to [Plaintext]. | 
 |     Plaintext, | 
 |     /// Corresponds to [Ciphertext]. | 
 |     Ciphertext, | 
 | } |