1use std::os::raw::{c_int, c_uint};
6
7use crate::{device::CryptDevice, err::LibcryptErr};
8
9pub struct CryptVolumeKeyHandle<'a> {
11 reference: &'a mut CryptDevice,
12}
13
14impl<'a> CryptVolumeKeyHandle<'a> {
15 pub(crate) fn new(reference: &'a mut CryptDevice) -> Self {
16 CryptVolumeKeyHandle { reference }
17 }
18
19 pub fn get(
22 &mut self,
23 keyslot: c_uint,
24 volume_key: &mut [u8],
25 passphrase: &[u8],
26 ) -> Result<(c_int, crate::size_t), LibcryptErr> {
27 let mut volume_key_size_t = volume_key.len();
28 errno_int_success!(mutex!(libcryptsetup_rs_sys::crypt_volume_key_get(
29 self.reference.as_ptr(),
30 keyslot as c_int,
31 to_mut_byte_ptr!(volume_key),
32 &mut volume_key_size_t as *mut _,
33 to_byte_ptr!(passphrase),
34 passphrase.len(),
35 )))
36 .map(|i| (i, volume_key_size_t))
37 }
38
39 pub fn verify(&mut self, volume_key: &[u8]) -> Result<(), LibcryptErr> {
41 errno!(mutex!(libcryptsetup_rs_sys::crypt_volume_key_verify(
42 self.reference.as_ptr(),
43 to_byte_ptr!(volume_key),
44 volume_key.len(),
45 )))
46 }
47}