blob: 165272e97687f1674c44ce7f6b430ea8df2db3bf [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.
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
/// An implementation of AES-GCM-SIV.
///
/// An AesGcmSiv impl may be used for encryption and decryption.
pub trait AesGcmSiv: Aead<Nonce = [u8; 12]> {}
/// An implementation of AES-GCM.
///
/// An AesGcm impl may be used for encryption and decryption.
pub trait AesGcm: Aead<Nonce = [u8; 12]> {}
/// Error returned on unsuccessful AEAD operation.
#[derive(Debug)]
pub struct AeadError;
/// Initializes an AEAD
pub trait AeadInit<K: crate::aes::AesKey> {
/// Instantiates a new instance of the AEAD from key material.
fn new(key: &K) -> Self;
}
/// Authenticated Encryption with Associated Data (AEAD) algorithm, where `N` is the size of the
/// Nonce. Encrypts and decrypts buffers in-place.
pub trait Aead {
/// The size of the authentication tag, this is appended to the message on the encrypt operation
/// and truncated from the plaintext after decrypting.
const TAG_SIZE: usize;
/// The cryptographic nonce used by the AEAD. The nonce must be unique for all messages with
/// the same key. This is critically important - nonce reuse may completely undermine the
/// security of the AEAD. Nonces may be predictable and public, so long as they are unique.
type Nonce: AsRef<[u8]>;
/// The type of the tag, which should always be [u8; Self::TAG_SIZE].
type Tag: AsRef<[u8]>;
/// Encrypt the given buffer containing a plaintext message. On success returns the encrypted
/// `msg` and appended auth tag, which will result in a Vec which is `Self::TAG_SIZE` bytes
/// greater than the initial message.
#[cfg(feature = "alloc")]
fn encrypt(&self, msg: &[u8], aad: &[u8], nonce: &Self::Nonce) -> Result<Vec<u8>, AeadError>;
/// Encrypt the given buffer containing a plaintext message in-place, and returns the tag in the
/// result value.
fn encrypt_detached(
&self,
msg: &mut [u8],
aad: &[u8],
nonce: &Self::Nonce,
) -> Result<Self::Tag, AeadError>;
/// Decrypt the message, returning the decrypted plaintext or an error in the event the
/// provided authentication tag does not match the given ciphertext. On success the returned
/// Vec will only contain the plaintext and so will be `Self::TAG_SIZE` bytes less than the
/// initial message.
#[cfg(feature = "alloc")]
fn decrypt(&self, msg: &[u8], aad: &[u8], nonce: &Self::Nonce) -> Result<Vec<u8>, AeadError>;
/// Decrypt the message in-place, returning an error and leaving the input `msg` unchanged in
/// the event the provided authentication tag does not match the given ciphertext.
fn decrypt_detached(
&self,
msg: &mut [u8],
aad: &[u8],
nonce: &Self::Nonce,
tag: &Self::Tag,
) -> Result<(), AeadError>;
}