double-ratchet-rs/src/aead.rs
2021-05-13 13:24:52 +02:00

45 lines
No EOL
1.4 KiB
Rust

use aes_gcm_siv::{Key, Aes256GcmSiv, Nonce};
use aes_gcm_siv::aead::{NewAead, AeadInPlace};
use alloc::vec::Vec;
const CONSTANT_NONCE: &[u8] = b"Super Noncel";
pub fn encrypt(mk: &[u8; 32], plaintext: &[u8], associated_data: &[u8]) -> Vec<u8> {
let key = Key::from_slice(mk);
let cipher = Aes256GcmSiv::new(key);
let nonce = Nonce::from_slice(&CONSTANT_NONCE);
let mut buffer = Vec::new();
buffer.extend_from_slice(plaintext);
cipher.encrypt_in_place(nonce, associated_data, &mut buffer)
.expect("Encryption failed");
buffer
}
pub fn decrypt(mk: &[u8; 32], ciphertext: &[u8], associated_data: &[u8]) -> Vec<u8> {
let key = Key::from_slice(mk);
let cipher = Aes256GcmSiv::new(key);
let nonce = Nonce::from_slice(&CONSTANT_NONCE);
let mut buffer = Vec::new();
buffer.extend_from_slice(ciphertext);
cipher.decrypt_in_place(nonce, associated_data, &mut buffer).expect("Decryption failure");
buffer
}
#[cfg(test)]
mod tests {
use crate::kdf_chain::gen_mk;
use crate::aead::{encrypt, decrypt};
#[test]
fn enc_a_dec() {
let test_data = include_bytes!("aead.rs").to_vec();
let associated_data = include_bytes!("lib.rs").to_vec();
let mk = gen_mk();
let ciphertext = encrypt(&mk, &test_data, &associated_data);
let plaintext = decrypt(&mk, &ciphertext, &associated_data);
assert_eq!(test_data, plaintext)
}
}