tpfs_krypt 7.1.8

An interface for accessing secrets
Documentation
use crate::{
    core::{KeyPair, SharedEncryptor},
    crypto::translator::KeyPairInstance,
    DecryptionStrategy::{Receiver, Sender},
    KeyType, SentMessage,
};
use proptest::prelude::*;
use secrecy::ExposeSecret;

proptest! {
    #![proptest_config(ProptestConfig::with_cases(20))]
    #[test]
    fn sender_encrypt_receiver_decrypt(
        message in proptest::string::bytes_regex(".+").unwrap(),
        public_input in proptest::string::bytes_regex(".+").unwrap()
    ) {
        let sender_key = KeyPairInstance::generate(KeyType::SharedEncryptionX25519).unwrap();
        let receiver_key = KeyPairInstance::generate(KeyType::SharedEncryptionX25519).unwrap();

        let receiver_public_key = &receiver_key.public();

        let encrypted = sender_key.shared_encrypt(receiver_public_key, &message,
                                                  &public_input).unwrap();
        let decrypted = receiver_key.shared_decrypt(Receiver(encrypted)).unwrap();
        prop_assert_eq!(message, decrypted.expose_secret().as_slice());
    }
}

proptest! {
    #![proptest_config(ProptestConfig::with_cases(20))]
    #[test]
    fn sender_encrypt_decrypt(
        message in proptest::string::bytes_regex(".+").unwrap(),
        public_input in proptest::string::bytes_regex(".+").unwrap()
    ) {
        let sender_key = KeyPairInstance::generate(KeyType::SharedEncryptionX25519).unwrap();
        let receiver_key = KeyPairInstance::generate(KeyType::SharedEncryptionX25519).unwrap();
        let receiver_public_key = receiver_key.public();

        let encrypted = sender_key.shared_encrypt(&receiver_public_key, &message, &public_input)
            .unwrap();
        let mut receiver_pubkey = <[u8; 32]>::default();
        receiver_pubkey.clone_from_slice(receiver_public_key.as_slice());
        let sent_message = SentMessage {
            ephemeral_key_input: public_input.to_vec(),
            receiver_pubkey,
            ciphertext: encrypted.ciphertext
        };
        let decrypted = sender_key.shared_decrypt(Sender(sent_message))
            .unwrap();

        prop_assert_eq!(message, decrypted.expose_secret().as_slice());
    }
}