#![cfg(all(feature = "signature", feature = "recipient"))]
use bc_components::{Decrypter, Encrypter, Signer, SigningOptions, Verifier};
use crate::{Envelope, Result};
impl Envelope {
pub fn seal(
&self,
sender: &dyn Signer,
recipient: &dyn Encrypter,
) -> Envelope {
self.sign(sender).encrypt_to_recipient(recipient)
}
pub fn seal_opt(
&self,
sender: &dyn Signer,
recipient: &dyn Encrypter,
options: Option<SigningOptions>,
) -> Envelope {
self.sign_opt(sender, options)
.encrypt_to_recipient(recipient)
}
pub fn unseal(
&self,
sender: &dyn Verifier,
recipient: &dyn Decrypter,
) -> Result<Envelope> {
self.decrypt_to_recipient(recipient)?.verify(sender)
}
}
#[cfg(all(test, feature = "signature", feature = "recipient"))]
mod tests {
use bc_components::{EncapsulationScheme, SignatureScheme, SigningOptions};
use super::*;
use crate::Result;
#[test]
fn test_seal_and_unseal() -> Result<()> {
let message = "Top secret message";
let original_envelope = Envelope::new(message);
let (sender_private, sender_public) =
SignatureScheme::Ed25519.keypair();
let (recipient_private, recipient_public) =
EncapsulationScheme::X25519.keypair();
let sealed_envelope =
original_envelope.seal(&sender_private, &recipient_public);
assert!(sealed_envelope.is_subject_encrypted());
let unsealed_envelope =
sealed_envelope.unseal(&sender_public, &recipient_private)?;
let extracted_message: String = unsealed_envelope.extract_subject()?;
assert_eq!(extracted_message, message);
Ok(())
}
#[test]
#[cfg(all(feature = "signature", feature = "recipient"))]
fn test_seal_opt_with_options() -> Result<()> {
let message = "Confidential data";
let original_envelope = Envelope::new(message);
let (sender_private, sender_public) =
SignatureScheme::Ed25519.keypair();
let (recipient_private, recipient_public) =
EncapsulationScheme::X25519.keypair();
let options = SigningOptions::Ssh {
namespace: "test".to_string(),
hash_alg: ssh_key::HashAlg::Sha512,
};
let sealed_envelope = original_envelope.seal_opt(
&sender_private,
&recipient_public,
Some(options),
);
assert!(sealed_envelope.is_subject_encrypted());
let unsealed_envelope =
sealed_envelope.unseal(&sender_public, &recipient_private)?;
let extracted_message: String = unsealed_envelope.extract_subject()?;
assert_eq!(extracted_message, message);
Ok(())
}
}