// 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 {} /// An implementation of AES-GCM. /// /// An AesGcm impl may be used for encryption and decryption. pub trait AesGcm: Aead {} /// Error returned on unsuccessful AEAD operation. #[derive(Debug)] pub struct AeadError; /// Initializes an AEAD pub trait AeadInit { /// 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, 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; /// 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, 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>; }