Revision control
Copy as Markdown
Other Tools
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// Copyright by contributors to this project.
// SPDX-License-Identifier: (Apache-2.0 OR MIT)
#[cfg(feature = "mock")]
use mockall::automock;
use alloc::vec::Vec;
use mls_rs_core::{crypto::CipherSuite, error::IntoAnyError};
pub const AEAD_ID_EXPORT_ONLY: u16 = 0xFFFF;
pub const AES_TAG_LEN: usize = 16;
/// A trait that provides the required AEAD functions
#[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)]
#[cfg_attr(all(target_arch = "wasm32", mls_build_async), maybe_async::must_be_async(?Send))]
#[cfg_attr(
all(not(target_arch = "wasm32"), mls_build_async),
maybe_async::must_be_async
)]
#[cfg_attr(feature = "mock", automock(type Error = crate::mock::TestError;))]
pub trait AeadType: Send + Sync {
type Error: IntoAnyError;
fn aead_id(&self) -> u16;
#[allow(clippy::needless_lifetimes)]
async fn seal<'a>(
&self,
key: &[u8],
data: &[u8],
aad: Option<&'a [u8]>,
nonce: &[u8],
) -> Result<Vec<u8>, Self::Error>;
#[allow(clippy::needless_lifetimes)]
async fn open<'a>(
&self,
key: &[u8],
ciphertext: &[u8],
aad: Option<&'a [u8]>,
nonce: &[u8],
) -> Result<Vec<u8>, Self::Error>;
fn key_size(&self) -> usize;
fn nonce_size(&self) -> usize;
}
/// AEAD Id, as specified in RFC 9180, Section 5.1 and Table 5.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(u16)]
#[non_exhaustive]
pub enum AeadId {
/// AES-128-GCM: 16 byte key, 12 byte nonce, 16 byte tag
Aes128Gcm = 0x0001,
/// AES-256-GCM: 32 byte key, 12 byte nonce, 16 byte tag
Aes256Gcm = 0x0002,
/// ChaCha20-Poly1305: 32 byte key, 12 byte nonce, 16 byte tag
Chacha20Poly1305 = 0x0003,
}
impl AeadId {
pub fn new(cipher_suite: CipherSuite) -> Option<Self> {
match cipher_suite {
CipherSuite::P256_AES128 | CipherSuite::CURVE25519_AES128 => Some(AeadId::Aes128Gcm),
CipherSuite::CURVE448_AES256 | CipherSuite::P384_AES256 | CipherSuite::P521_AES256 => {
Some(AeadId::Aes256Gcm)
}
CipherSuite::CURVE25519_CHACHA | CipherSuite::CURVE448_CHACHA => {
Some(AeadId::Chacha20Poly1305)
}
_ => None,
}
}
pub fn key_size(&self) -> usize {
match self {
AeadId::Aes128Gcm => 16,
AeadId::Aes256Gcm => 32,
AeadId::Chacha20Poly1305 => 32,
}
}
pub fn nonce_size(&self) -> usize {
12
}
}