cryptoki/session/
message_decryption.rs1use crate::context::Function;
6use crate::error::{Result, Rv};
7use crate::mechanism::{Mechanism, MessageParam};
8use crate::object::ObjectHandle;
9use crate::session::Session;
10use cryptoki_sys::*;
11use std::convert::TryInto;
12
13impl Session {
14 pub fn message_decrypt_init(&self, mechanism: &Mechanism, key: ObjectHandle) -> Result<()> {
16 let mut mechanism: CK_MECHANISM = mechanism.into();
17
18 unsafe {
19 Rv::from(get_pkcs11!(self.client(), C_MessageDecryptInit)(
20 self.handle(),
21 &mut mechanism as CK_MECHANISM_PTR,
22 key.handle(),
23 ))
24 .into_result(Function::MessageDecryptInit)?;
25 }
26
27 Ok(())
28 }
29
30 pub fn decrypt_message(
32 &self,
33 param: &MessageParam,
34 aad: &[u8],
35 encrypted_data: &[u8],
36 ) -> Result<Vec<u8>> {
37 let mut data_len = 0;
38 unsafe {
40 Rv::from(get_pkcs11!(self.client(), C_DecryptMessage)(
41 self.handle(),
42 param.as_ptr(),
43 param.len(),
44 aad.as_ptr() as *mut u8,
45 aad.len().try_into()?,
46 encrypted_data.as_ptr() as *mut u8,
47 encrypted_data.len().try_into()?,
48 std::ptr::null_mut(),
49 &mut data_len,
50 ))
51 .into_result(Function::DecryptMessage)?;
52 }
53
54 let mut data = vec![0; data_len.try_into()?];
55
56 unsafe {
57 Rv::from(get_pkcs11!(self.client(), C_DecryptMessage)(
58 self.handle(),
59 param.as_ptr(),
60 param.len(),
61 aad.as_ptr() as *mut u8,
62 aad.len().try_into()?,
63 encrypted_data.as_ptr() as *mut u8,
64 encrypted_data.len().try_into()?,
65 data.as_mut_ptr(),
66 &mut data_len,
67 ))
68 .into_result(Function::DecryptMessage)?;
69 }
70
71 data.resize(data_len.try_into()?, 0);
72
73 Ok(data)
74 }
75
76 pub fn decrypt_message_begin(&self, param: MessageParam, aad: &[u8]) -> Result<()> {
78 unsafe {
79 Rv::from(get_pkcs11!(self.client(), C_DecryptMessageBegin)(
80 self.handle(),
81 param.as_ptr(),
82 param.len(),
83 aad.as_ptr() as *mut u8,
84 aad.len().try_into()?,
85 ))
86 .into_result(Function::DecryptMessageBegin)
87 }
88 }
89
90 pub fn decrypt_message_next(
92 &self,
93 param: MessageParam,
94 encrypted_data: &[u8],
95 end: bool,
96 ) -> Result<Vec<u8>> {
97 let mut data_len = 0;
98 unsafe {
100 Rv::from(get_pkcs11!(self.client(), C_DecryptMessageNext)(
101 self.handle(),
102 param.as_ptr(),
103 param.len(),
104 encrypted_data.as_ptr() as *mut u8,
105 encrypted_data.len().try_into()?,
106 std::ptr::null_mut(),
107 &mut data_len,
108 if end { CKF_END_OF_MESSAGE } else { 0 },
109 ))
110 .into_result(Function::DecryptMessageNext)?;
111 }
112 let mut data = vec![0; data_len.try_into()?];
113 unsafe {
114 Rv::from(get_pkcs11!(self.client(), C_DecryptMessageNext)(
115 self.handle(),
116 param.as_ptr(),
117 param.len(),
118 encrypted_data.as_ptr() as *mut u8,
119 encrypted_data.len().try_into()?,
120 data.as_mut_ptr(),
121 &mut data_len,
122 if end { CKF_END_OF_MESSAGE } else { 0 },
123 ))
124 .into_result(Function::DecryptMessageNext)?;
125 }
126 data.resize(data_len.try_into()?, 0);
127
128 Ok(data)
129 }
130
131 pub fn message_decrypt_final(&self) -> Result<()> {
133 unsafe {
134 Rv::from(get_pkcs11!(self.client(), C_MessageDecryptFinal)(
135 self.handle(),
136 ))
137 .into_result(Function::MessageDecryptFinal)?;
138 }
139
140 Ok(())
141 }
142}