blob: b61106d6c9cec5767115b37f3d3c2e3987943ba6 [file] [log] [blame]
// Copyright 2023 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.
//! Credential types used in deserialization.
//!
//! While simple implementations are provided to get started with, there is likely opportunity for
//! efficiency gains with implementations tailored to suit (e.g. caching a few hot credentials
//! rather than reading from disk every time, etc).
use crate::credential::matched::{MatchedCredential, ReferencedMatchedCredential};
use core::fmt::Debug;
use crypto_provider::{aead::Aead, aes, CryptoProvider, FromCryptoRng};
pub mod book;
pub mod matched;
pub mod source;
pub mod v0;
pub mod v1;
#[cfg(any(test, feature = "alloc"))]
pub mod metadata;
#[cfg(test)]
mod tests;
/// Information about a credential as supplied by the caller.
pub struct MatchableCredential<V: ProtocolVersion, M: MatchedCredential> {
/// The cryptographic information associated
/// with this particular credential which is used for discovering
/// advertisements/advertisement sections generated via the
/// paired sender credential.
pub discovery_credential: V::DiscoveryCredential,
/// The data which will be yielded back to the caller upon a successful
/// identity-match against this credential.
pub match_data: M,
}
impl<V: ProtocolVersion, M: MatchedCredential> MatchableCredential<V, M> {
/// Views this credential as a (borrowed) discovery-credential
/// combined with some matched credential data
/// (which is copied - see documentation on [`MatchedCredential`])
pub fn as_pair(&self) -> (&V::DiscoveryCredential, ReferencedMatchedCredential<M>) {
(&self.discovery_credential, ReferencedMatchedCredential::from(&self.match_data))
}
}
/// Error returned when metadata decryption fails.
#[derive(Debug, Eq, PartialEq)]
pub struct MetadataDecryptionError;
/// Seal for protocol versions to enforce totality.
pub(crate) mod protocol_version_seal {
/// Internal-only supertrait of protocol versions
/// for the purpose of sealing the trait.
pub trait ProtocolVersionSeal: Clone {}
}
/// Marker trait for protocol versions (V0/V1)
/// and associated data about them.
pub trait ProtocolVersion: protocol_version_seal::ProtocolVersionSeal {
/// The discovery credential type for this protocol version, which
/// is the minimal amount of cryptographic materials that we need
/// in order to discover advertisements/sections which make
/// use of the sender-paired version of the credential.
type DiscoveryCredential: DiscoveryMetadataCryptoMaterial<Self> + Clone;
/// The native-length identity token for this protocol version
/// [i.e: if V0, a 14-byte identity token, or if V1, a 16-byte
/// identity token.]
type IdentityToken: Clone + AsRef<[u8]> + FromCryptoRng;
/// Computes the metadata nonce for this version from the given key-seed.
fn metadata_nonce_from_key_seed<C: CryptoProvider>(
hkdf: &np_hkdf::NpKeySeedHkdf<C>,
) -> <C::Aes128Gcm as Aead>::Nonce;
// TODO this should be done by the identity provider that owns the corresponding credential
/// Transforms the passed metadata key (if needed) to a 16-byte metadata key
/// which may be used for metadata encryption/decryption
fn extract_metadata_key<C: CryptoProvider>(
identity_token: Self::IdentityToken,
) -> aes::Aes128Key;
}
/// Trait for structures which provide cryptographic
/// materials for discovery in a particular protocol version.
/// See [`crate::credential::v0::V0DiscoveryCryptoMaterial`]
/// and [`crate::credential::v1::V1DiscoveryCryptoMaterial`]
/// for V0 and V1 specializations.
pub trait DiscoveryMetadataCryptoMaterial<V: ProtocolVersion> {
/// Constructs or copies the metadata nonce used for decryption of associated credential
/// metadata for the identity represented via this crypto material.
fn metadata_nonce<C: CryptoProvider>(&self) -> [u8; 12];
}