use crate::context::Context;
use crate::error::{check, Result};
use crate::ffi;
use crate::ops::{Input, Output};
pub fn decrypt(ctx: &Context, ciphertext: &[u8]) -> Result<Vec<u8>> {
let input = Input::from_memory(ciphertext)?;
let output = Output::to_memory()?;
unsafe {
check(ffi::rnp_decrypt(ctx.ffi, input.as_ptr(), output.as_ptr()))?;
}
output.into_bytes()
}
pub fn decrypt_to(ctx: &Context, ciphertext: &[u8], output: &mut Output) -> Result<()> {
let input = Input::from_memory(ciphertext)?;
unsafe { check(ffi::rnp_decrypt(ctx.ffi, input.as_ptr(), output.as_ptr())) }
}
pub struct Decryptor<'a, 'ctx> {
ctx: &'ctx Context,
ciphertext: &'a [u8],
}
impl<'a, 'ctx> Decryptor<'a, 'ctx> {
pub fn new(ctx: &'ctx Context, ciphertext: &'a [u8]) -> Self {
Decryptor { ctx, ciphertext }
}
pub fn build(self) -> Result<DecryptResult<'ctx>> {
let plaintext = {
let input = Input::from_memory(self.ciphertext)?;
let output = Output::to_memory()?;
unsafe {
check(ffi::rnp_decrypt(self.ctx.ffi, input.as_ptr(), output.as_ptr()))?;
}
output.into_bytes()?
};
let null_out = Output::to_null()?;
let op = crate::verify::VerifyOp::inline(self.ctx, self.ciphertext, null_out)?;
let verify_result = op.execute()?;
Ok(DecryptResult {
verify_result,
plaintext,
})
}
}
pub struct DecryptResult<'ctx> {
verify_result: crate::verify::VerifyResult<'ctx>,
plaintext: Vec<u8>,
}
impl<'ctx> DecryptResult<'ctx> {
pub fn plaintext(&self) -> &[u8] {
&self.plaintext
}
pub fn into_plaintext(self) -> Vec<u8> {
self.plaintext
}
pub fn verify_result(&self) -> &crate::verify::VerifyResult<'ctx> {
&self.verify_result
}
pub fn recipient_count(&self) -> Result<usize> {
self.verify_result.recipient_count()
}
pub fn recipient_at(&self, idx: usize) -> Result<Option<crate::verify::Recipient>> {
self.verify_result.recipient_at(idx)
}
pub fn used_recipient(&self) -> Result<Option<crate::verify::Recipient>> {
self.verify_result.used_recipient()
}
pub fn symenc_count(&self) -> Result<usize> {
self.verify_result.symenc_count()
}
pub fn symenc_at(&self, idx: usize) -> Result<Option<crate::verify::Symenc>> {
self.verify_result.symenc_at(idx)
}
pub fn used_symenc(&self) -> Result<Option<crate::verify::Symenc>> {
self.verify_result.used_symenc()
}
pub fn file_info(&self) -> Result<Option<crate::verify::FileInfo>> {
self.verify_result.file_info()
}
pub fn protection_info(&self) -> Result<(String, String, bool)> {
self.verify_result.protection_info()
}
pub fn format(&self) -> Result<char> {
self.verify_result.format()
}
}