pub(crate) mod private {
use crate::Public;
use crate::errors::UnknownCryptoError;
use crate::generics::{Secret, TypeSpec, sealed};
use crate::hazardous::hpke::mode::private::HpkeMode;
use crate::hazardous::hpke::private::{HpkeEncapKey, HpkePrivateKey, HpkePublicKey};
pub trait HpkeKem: sealed::Sealed {
const KEM_ID: [u8; 2];
const NSECRET: usize;
const NENC: usize;
const NPK: usize;
const NSK: usize;
type PrivateKey: HpkePrivateKey;
type PublicKey: HpkePublicKey;
type EncapsulatedKey: HpkeEncapKey;
type EphemeralSecret: HpkePrivateKey;
type SharedSecretSpec: TypeSpec;
type KeyPair;
fn derive_keypair(ikm: &[u8]) -> Result<Self::KeyPair, UnknownCryptoError>;
#[cfg(feature = "safe_api")]
fn encap(
pubkey_r: &Self::PublicKey,
) -> Result<(Secret<Self::SharedSecretSpec>, Self::EncapsulatedKey), UnknownCryptoError>;
fn encap_deterministic(
pubkey_r: &Self::PublicKey,
secret_ephemeral: Self::EphemeralSecret,
) -> Result<(Secret<Self::SharedSecretSpec>, Self::EncapsulatedKey), UnknownCryptoError>;
fn decap(
enc: &Self::EncapsulatedKey,
secret_key_r: &Self::PrivateKey,
) -> Result<Secret<Self::SharedSecretSpec>, UnknownCryptoError>;
}
pub trait HpkeAuthKem: HpkeKem {
#[cfg(feature = "safe_api")]
fn auth_encap(
pubkey_r: &Self::PublicKey,
secret_key_s: &Self::PrivateKey,
) -> Result<(Secret<Self::SharedSecretSpec>, Self::EncapsulatedKey), UnknownCryptoError>;
fn auth_encap_deterministic(
pubkey_r: &Self::PublicKey,
secret_key_s: &Self::PrivateKey,
secret_ephemeral: Self::EphemeralSecret,
) -> Result<(Secret<Self::SharedSecretSpec>, Self::EncapsulatedKey), UnknownCryptoError>;
fn auth_decap(
enc: &Self::EncapsulatedKey,
secret_key_r: &Self::PrivateKey,
pubkey_s: &Self::PublicKey,
) -> Result<Secret<Self::SharedSecretSpec>, UnknownCryptoError>;
}
pub trait HpkeKdf: sealed::Sealed {
const KDF_ID: [u8; 2];
const NH: usize;
#[cfg(test)]
type ExporterSecret: AsRef<[u8]> + AsMut<[u8]> + Clone;
#[cfg(not(test))]
type ExporterSecret: AsRef<[u8]> + AsMut<[u8]>;
const EXPORTER_SECRET_INIT: Self::ExporterSecret;
#[allow(clippy::too_many_arguments)]
fn combine_secrets(
suite_id: &[u8; 10],
mode: &HpkeMode,
shared_secret: &[u8],
info: &[u8],
psk: &[u8],
psk_id: &[u8],
nk: usize,
nn: usize,
out: &mut [u8],
) -> Result<(), UnknownCryptoError>;
fn export(
suite_id: &[u8; 10],
exporter_secret: &[u8],
exporter_context: &[u8],
out: &mut [u8],
) -> Result<(), UnknownCryptoError>;
}
pub trait HpkeAead: sealed::Sealed {
const AEAD_ID: [u8; 2];
const NK: usize;
const NN: usize;
const NT: usize;
#[cfg(test)]
type Key: TypeSpec + Clone;
#[cfg(not(test))]
type Key: TypeSpec;
#[cfg(test)]
type Nonce: TypeSpec + Clone;
#[cfg(not(test))]
type Nonce: TypeSpec;
const KEY_INIT: Secret<Self::Key>;
const NONCE_INIT: Public<Self::Nonce>;
fn seal(
key: &Secret<Self::Key>,
nonce: &Public<Self::Nonce>,
plaintext: &[u8],
aad: &[u8],
out: &mut [u8],
) -> Result<(), UnknownCryptoError>;
fn open(
key: &Secret<Self::Key>,
nonce: &Public<Self::Nonce>,
ciphertext: &[u8],
aad: &[u8],
out: &mut [u8],
) -> Result<(), UnknownCryptoError>;
}
pub trait Suite: sealed::Sealed {
type PrivateKey: HpkePrivateKey;
type PublicKey: HpkePublicKey;
type EncapsulatedKey: HpkeEncapKey;
type EphemeralSecret: HpkePrivateKey;
fn key_schedule(
mode: &HpkeMode,
shared_secret: &[u8],
info: &[u8],
psk: &[u8],
psk_id: &[u8],
) -> Result<Self, UnknownCryptoError>
where
Self: Sized;
#[cfg(feature = "safe_api")]
fn setup_base_sender(
pubkey_r: &Self::PublicKey,
info: &[u8],
) -> Result<(Self, Self::EncapsulatedKey), UnknownCryptoError>
where
Self: Sized;
fn setup_base_sender_deterministic(
pubkey_r: &Self::PublicKey,
info: &[u8],
secret_ephemeral: Self::EphemeralSecret,
) -> Result<(Self, Self::EncapsulatedKey), UnknownCryptoError>
where
Self: Sized;
fn setup_base_recipient(
enc: &Self::EncapsulatedKey,
secret_key_r: &Self::PrivateKey,
info: &[u8],
) -> Result<Self, UnknownCryptoError>
where
Self: Sized;
#[cfg(feature = "safe_api")]
fn setup_psk_sender(
pubkey_r: &Self::PublicKey,
info: &[u8],
psk: &[u8],
psk_id: &[u8],
) -> Result<(Self, Self::EncapsulatedKey), UnknownCryptoError>
where
Self: Sized;
fn setup_psk_sender_deterministic(
pubkey_r: &Self::PublicKey,
info: &[u8],
psk: &[u8],
psk_id: &[u8],
secret_ephemeral: Self::EphemeralSecret,
) -> Result<(Self, Self::EncapsulatedKey), UnknownCryptoError>
where
Self: Sized;
fn setup_psk_recipient(
enc: &Self::EncapsulatedKey,
secret_key_r: &Self::PrivateKey,
info: &[u8],
psk: &[u8],
psk_id: &[u8],
) -> Result<Self, UnknownCryptoError>
where
Self: Sized;
fn seal(
&mut self,
plaintext: &[u8],
aad: &[u8],
out: &mut [u8],
) -> Result<(), UnknownCryptoError>;
fn open(
&mut self,
ciphertext: &[u8],
aad: &[u8],
out: &mut [u8],
) -> Result<(), UnknownCryptoError>;
fn export(&self, exporter_context: &[u8], out: &mut [u8])
-> Result<(), UnknownCryptoError>;
}
pub trait AuthSuite: Suite {
#[cfg(feature = "safe_api")]
fn setup_auth_sender(
pubkey_r: &Self::PublicKey,
info: &[u8],
secret_key_s: &Self::PrivateKey,
) -> Result<(Self, Self::EncapsulatedKey), UnknownCryptoError>
where
Self: Sized;
fn setup_auth_sender_deterministic(
pubkey_r: &Self::PublicKey,
info: &[u8],
secret_key_s: &Self::PrivateKey,
secret_ephemeral: Self::EphemeralSecret,
) -> Result<(Self, Self::EncapsulatedKey), UnknownCryptoError>
where
Self: Sized;
fn setup_auth_recipient(
enc: &Self::EncapsulatedKey,
secret_key_r: &Self::PrivateKey,
info: &[u8],
pubkey_s: &Self::PublicKey,
) -> Result<Self, UnknownCryptoError>
where
Self: Sized;
#[cfg(feature = "safe_api")]
fn setup_authpsk_sender(
pubkey_r: &Self::PublicKey,
info: &[u8],
psk: &[u8],
psk_id: &[u8],
secret_key_s: &Self::PrivateKey,
) -> Result<(Self, Self::EncapsulatedKey), UnknownCryptoError>
where
Self: Sized;
fn setup_authpsk_sender_deterministic(
pubkey_r: &Self::PublicKey,
info: &[u8],
psk: &[u8],
psk_id: &[u8],
secret_key_s: &Self::PrivateKey,
secret_ephemeral: Self::EphemeralSecret,
) -> Result<(Self, Self::EncapsulatedKey), UnknownCryptoError>
where
Self: Sized;
fn setup_authpsk_recipient(
enc: &Self::EncapsulatedKey,
secret_key_r: &Self::PrivateKey,
info: &[u8],
psk: &[u8],
psk_id: &[u8],
pubkey_s: &Self::PublicKey,
) -> Result<Self, UnknownCryptoError>
where
Self: Sized;
}
}