Skip to content

Commit ac74eed

Browse files
Added wrappers for multi-part digesting functions
Signed-off-by: Jacob Prud'homme <[email protected]>
1 parent 58114a4 commit ac74eed

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

cryptoki/src/session/digesting.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use crate::context::Function;
66
use crate::error::{Result, Rv};
77
use crate::mechanism::Mechanism;
8+
use crate::object::ObjectHandle;
89
use crate::session::Session;
910
use cryptoki_sys::*;
1011
use std::convert::TryInto;
@@ -52,4 +53,76 @@ impl Session {
5253

5354
Ok(digest)
5455
}
56+
57+
/// Starts new multi-part digesting operation
58+
pub fn digest_initialize(&self, m: &Mechanism) -> Result<()> {
59+
let mut mechanism: CK_MECHANISM = m.into();
60+
61+
unsafe {
62+
Rv::from(get_pkcs11!(self.client(), C_DigestInit)(
63+
self.handle(),
64+
&mut mechanism as CK_MECHANISM_PTR,
65+
))
66+
.into_result(Function::DigestInit)?;
67+
}
68+
69+
Ok(())
70+
}
71+
72+
/// Continues an ongoing multi-part digesting operation
73+
pub fn digest_update(&self, data: &[u8]) -> Result<()> {
74+
unsafe {
75+
Rv::from(get_pkcs11!(self.client(), C_DigestUpdate)(
76+
self.handle(),
77+
data.as_ptr() as *mut u8,
78+
data.len().try_into()?,
79+
))
80+
.into_result(Function::DigestUpdate)?;
81+
}
82+
83+
Ok(())
84+
}
85+
86+
/// Continues an ongoing multi-part digesting operation, using the value of a secret key as input
87+
pub fn digest_key(&self, key: ObjectHandle) -> Result<()> {
88+
unsafe {
89+
Rv::from(get_pkcs11!(self.client(), C_DigestKey)(
90+
self.handle(),
91+
key.handle(),
92+
))
93+
.into_result(Function::DigestKey)?;
94+
}
95+
96+
Ok(())
97+
}
98+
99+
/// Finalizes ongoing multi-part digest operation
100+
pub fn digest_finalize(&self) -> Result<Vec<u8>> {
101+
let mut digest_len = 0;
102+
103+
// Get the output buffer length
104+
unsafe {
105+
Rv::from(get_pkcs11!(self.client(), C_DigestFinal)(
106+
self.handle(),
107+
std::ptr::null_mut(),
108+
&mut digest_len,
109+
))
110+
.into_result(Function::DigestFinal)?;
111+
}
112+
113+
let mut digest = vec![0; digest_len.try_into()?];
114+
115+
unsafe {
116+
Rv::from(get_pkcs11!(self.client(), C_DigestFinal)(
117+
self.handle(),
118+
digest.as_mut_ptr(),
119+
&mut digest_len,
120+
))
121+
.into_result(Function::DigestFinal)?;
122+
}
123+
124+
digest.resize(digest_len.try_into()?, 0);
125+
126+
Ok(digest)
127+
}
55128
}

0 commit comments

Comments
 (0)