use libc::c_void;
use std::ptr;
use crate::yaca_common as common;
use crate::yaca_lib as lib;
use crate::yaca_conv as conv;
use crate::crypto::Context;
use crate::*;
pub struct DigestContext {
handle: *mut c_void,
}
impl Drop for DigestContext {
fn drop(&mut self)
{
unsafe {
lib::yaca_context_destroy(self.handle)
}
}
}
impl Context for DigestContext {
fn get_handle(&self) -> *mut c_void
{
self.handle
}
}
impl DigestContext {
pub fn initialize(algo: &DigestAlgorithm) -> Result<DigestContext>
{
digest_initialize(algo)
}
pub fn update(&self, message: &[u8]) -> Result<()>
{
digest_update(self, message)
}
pub fn finalize(&self) -> Result<Vec<u8>>
{
digest_finalize(&self)
}
}
#[inline]
fn digest_initialize(algo: &DigestAlgorithm) -> Result<DigestContext>
{
let algo = conv::digest_rs_to_c(algo);
let mut handle = ptr::null_mut();
let r = unsafe {
lib::yaca_digest_initialize(&mut handle, algo)
};
conv::res_c_to_rs(r)?;
debug_assert!(!handle.is_null());
Ok(DigestContext{handle})
}
#[inline]
fn digest_update(ctx: &DigestContext, message: &[u8]) -> Result<()>
{
common::hash_upd(ctx, message, lib::yaca_digest_update)
}
#[inline]
fn digest_finalize(ctx: &DigestContext) -> Result<Vec<u8>>
{
common::hash_fin(ctx, lib::yaca_digest_finalize)
}